3

ファイルをダウンロードしようとしましたが、特殊文字を含むすべてのファイルを認識できません。他のファイルはダウンロードできますが、指定されたファイルはasdf#code@.pdfダウンロードできません。

エラー:

リモート サーバーがエラーを返しました: (550) ファイルが利用できません (ファイルが見つからない、アクセスできないなど)。

ローカルでは、正しい名前のファイルが作成されますが、空です。ファイル名の中にあるJPG ファイルでも同じことが起こり#ます。どうすればそれらを認識させることができますか?

//Download the file from remote path on FTP to local path
private static void Download(string remotePath, string localPath)
{
    FtpWebRequest reqFTP;
    try
    {
        reqFTP = GetWebRequest(WebRequestMethods.Ftp.DownloadFile, remotePath);
        FileStream outputStream = new FileStream(localPath, FileMode.Create);

        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream ftpStream = response.GetResponseStream();
        long cl = response.ContentLength;
        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[bufferSize];
        readCount = ftpStream.Read(buffer, 0, bufferSize);
        while (readCount > 0)
        {
            outputStream.Write(buffer, 0, readCount);
            readCount = ftpStream.Read(buffer, 0, bufferSize);
        }
        ftpStream.Close();
        outputStream.Close();
        response.Close();
        Console.WriteLine("File Download: ", remotePath + " is downloaded completely");
        logWriter.WriteLog("File Download: ", remotePath + " is downloaded completely, status " + response.StatusDescription);
    }
    catch (Exception ex)
    {
        logWriter.WriteLog("File Download: ", "Cannot download file from " + remotePath + " to " + localPath + "\n" + " Erro Message: " + ex.Message);
    }
}//End Download

//Web request for FTP
static public FtpWebRequest GetWebRequest(string method, string uri)
{
    Uri serverUri = new Uri(uri);

    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
        return null;
    }
    try
    {
        var reqFTP = (FtpWebRequest)FtpWebRequest.Create(serverUri);
        reqFTP.Method = method;
        reqFTP.UseBinary = true;
        reqFTP.Credentials = new NetworkCredential(userId, password);
        reqFTP.Proxy = null;
        reqFTP.KeepAlive = false;
        reqFTP.UsePassive = false;
        return reqFTP;
    }
    catch(Exception ex)
    {
        logWriter.WriteLog("Get Web Request: ","Cannot connect to " + uri + "\n" + "Error: " + ex.Message);
        return null;
    }
}
4

2 に答える 2

5

これは仕様によるものである可能性があります: URI 標準によると、 は URI#で有効な文字ではありません。したがって、有効な URIでftp://someServer/somePath/intro_to_c#.pdfはありません。

できることは、URIを作成するときにファイル名を適切にエスケープすることです。

string baseUri = "ftp://someServer/somePath/";
string file = "intro_to_c#.pdf";
string myUri = baseUri + HttpUtility.UrlEncode(file);
// yields ftp://someServer/somePath/intro_to_c%23.pdf

または、エスケープを適切に処理する UriBuilder クラスを使用することもできます。

Uri myUri = new UriBuilder("ftp", "someServer", 21, "somePath/intro_to_c#.pdf");
// yields ftp://someServer:21/somePath/intro_to_c%23.pdf
于 2013-07-24T04:54:10.360 に答える
1

いくつかのコードを追加して修正しました。hexEscape を使用して "#" をエスケープしますが、適切ではありません。URI の特殊文字をエスケープするアイデアはありますか?

    // Get the request using a specific URI 
    static public FtpWebRequest GetWebRequest(string method, string uri)
    {
        Uri serverUri = new Uri(uri);

        **if (serverUri.ToString().Contains("#"))
        {
            serverUri = new Uri(serverUri.ToString().Replace("#", Uri.HexEscape('#')));
        }**
        Console.WriteLine(serverUri.ToString());
        if (serverUri.Scheme != Uri.UriSchemeFtp)
        {
            return null;
        }
        try
        {
            var reqFTP = (FtpWebRequest)FtpWebRequest.Create(serverUri);
            reqFTP.Method = method;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(userId, password);
            reqFTP.Proxy = null;
            reqFTP.KeepAlive = false;
            reqFTP.UsePassive = false;
            return reqFTP;
        }

        catch (Exception ex)
        {
            logWriter.WriteLog("Get Web Request: ", "Cannot connect to " + uri + "\n" + "Error: " + ex.Message);
            return null;
        }
    }
于 2013-07-24T03:52:02.423 に答える