12

以下を使用してサーバーにzipファイルをアップロードしようとしてC# (Framework 4)いますが、私のコードは次のとおりです。

string ftpUrl = ConfigurationManager.AppSettings["ftpAddress"];
string ftpUsername = ConfigurationManager.AppSettings["ftpUsername"];
string ftpPassword = ConfigurationManager.AppSettings["ftpPassword"];  
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpUrl + "Transactions.zip");  
request.Proxy = new WebProxy(); //-----The requested FTP command is not supported when using HTTP proxy.
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = new NetworkCredential(ftpUsername, ftpPassword);
StreamReader sourceStream = new StreamReader(fileToBeUploaded);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
request.ContentLength = fileContents.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription);
            response.Close();  

zip ファイルは正常にアップロードされましたが、サーバーから (手動で) zip ファイルを開こうとすると、Unexpected end of archiveエラーが表示されました。
ファイル圧縮には、Ionic.zip dll. zipファイルを転送する前に、正常に解凍できました。

どんな助けでも感謝します。ありがとう。

4

1 に答える 1

21

これが問題です:

StreamReader sourceStream = new StreamReader(fileToBeUploaded);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());

StreamReader(および any TextReader) はテキストデータ用です。zip ファイルはテキスト データではありません。

使用するだけです:

byte[] fileContents = File.ReadAllBytes(fileToBeUploaded);

そうすれば、バイナリ データをテキストとして扱わないため、破損することはありません。

または、すべてを個別にメモリにロードしないでください。データをストリーミングするだけです。

using (var requestStream = request.GetRequestStream())
{
    using (var input = File.OpenRead(fileToBeUploaded))
    {
        input.CopyTo(requestStream);
    }
}

usingまた、単に呼び出すのではなく、これらすべてのストリームに対してステートメントを使用する必要があることに注意してくださいClose。これにより、例外がスローされた場合でもリソースが破棄されます。

于 2013-05-11T09:44:27.913 に答える