上传压缩文件时偶尔出现 ftp 450 错误
Sporadic ftp 450 errors when uploading compressed file
我有一个 800Mb 的文件正在使用 System.IO.Compression ZipArchive 进行压缩,因此:
using (ZipArchive zip = ZipFile.Open(result, ZipArchiveMode.Create))
{
zip.CreateEntryFromFile(sourceFile, entryName);
}
文件压缩总是成功的。一旦文件被压缩,它就会被上传到 ftp 服务器,并取得不同的成功。上传失败时,会出现以下错误:
远程服务器返回错误:(450) 文件不可用(例如,文件忙)。
堆栈跟踪:
在 System.Net.FtpWebRequest.SyncRequestCallback(对象对象)
在 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(对象对象)
在 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 实例可能没有被释放。我尝试过具有类似不一致结果的替代压缩库。有什么想法吗?
错误的原因原来与我最初的怀疑无关,而是与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())
{
}
我有一个 800Mb 的文件正在使用 System.IO.Compression ZipArchive 进行压缩,因此:
using (ZipArchive zip = ZipFile.Open(result, ZipArchiveMode.Create))
{
zip.CreateEntryFromFile(sourceFile, entryName);
}
文件压缩总是成功的。一旦文件被压缩,它就会被上传到 ftp 服务器,并取得不同的成功。上传失败时,会出现以下错误:
远程服务器返回错误:(450) 文件不可用(例如,文件忙)。
堆栈跟踪: 在 System.Net.FtpWebRequest.SyncRequestCallback(对象对象) 在 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(对象对象) 在 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 实例可能没有被释放。我尝试过具有类似不一致结果的替代压缩库。有什么想法吗?
错误的原因原来与我最初的怀疑无关,而是与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())
{
}