上传压缩文件时偶尔出现ftp 450错误

时间:2015-07-30 15:42:14

标签: c# .net ftp zip

我有一个使用System.IO.Compression ZipArchive压缩的800Mb文件,因此:

using (ZipArchive zip = ZipFile.Open(result, ZipArchiveMode.Create))
{
    zip.CreateEntryFromFile(sourceFile, entryName);
}

文件压缩始终成功。文件被压缩后,它将被上传到ftp服务器并获得成功。上传失败时,会出现以下错误:

远程服务器返回错误:(450)文件不可用(例如,文件繁忙)。

堆栈跟踪: 在System.Net.FtpWebRequest.SyncRequestCallback(Object obj) 在System.Net.CommandStream.Dispose(布尔处理) 在System.IO.Stream.Close() 在System.Net.ConnectionPool.Destroy(PooledStream pooledStream) 在System.Net.ConnectionPool.PutConnection(PooledStream pooledStream,Object owningObject,Int32 creationTimeout,Boolean canReuse) 在System.Net.FtpWebRequest.FinishRequestStage(RequestStage阶段) 在System.Net.FtpWebRequest.SyncRequestCallback(Object obj) 在System.Net.CommandStream.Abort(例外e) 在System.Net.CommandStream.CheckContinuePipeline() 在System.Net.FtpDataStream.System.Net.ICloseEx.CloseEx(CloseExState closeState) 在System.Net.FtpDataStream.Dispose(布尔处理) 在System.IO.Stream.Close()

如果我上传未压缩的原始文件,那么上传总是成功的。

我怀疑压缩文件是以某种方式锁定的,或者ZipArchive实例可能没有被处理掉。我尝试过具有类似不一致结果的替代压缩库。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

错误的原因与我最初的怀疑无关,但与ftp上传请求有关。由于zip文件是二进制格式,因此必须设置使用二进制的请求,并避免使用StreamReader从文件中获取字节。我的ftp代码最终如下:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri('ftpurl', filePath)));
request.Timeout = timeoutvalue;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;
request.Proxy = new WebProxy();
request.Credentials = new NetworkCredential('x','y');

byte[] encodedFileContents = File.ReadAllBytes(filePath);
request.ContentLength = encodedFileContents.Length;

using (Stream requestStream = request.GetRequestStream())
{
    requestStream.WriteTimeout = timeoutvalue;
    requestStream.Write(encodedFileContents, 0, encodedFileContents.Length);
}

using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
}