Я использую .NET 3.5, и мне нужно передать по FTP некоторые файлы. Я не хочу использовать файлы, потому что я управляю всеми, используя MemoryStream
и bytes arrays
.C# FtpWebRequest создает поврежденные файлы
Чтение этих статей (article и article), я сделал своего клиента.
public void Upload(byte[] fileBytes, string remoteFile)
{
try
{
string uri = string.Format("{0}:{1}/{2}", Hostname, Port, remoteFile);
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(uri);
ftp.Credentials = new NetworkCredential(Username.Normalize(), Password.Normalize());
ftp.UseBinary = true;
ftp.UsePassive = true;
ftp.Method = WebRequestMethods.Ftp.UploadFile;
using (Stream localFileStream = new MemoryStream(fileBytes))
{
using (Stream ftpStream = ftp.GetRequestStream())
{
int bufferSize = (int)Math.Min(localFileStream.Length, 2048);
byte[] buffer = new byte[bufferSize];
int bytesSent = -1;
while (bytesSent != 0)
{
bytesSent = localFileStream.Read(buffer, 0, bufferSize);
ftpStream.Write(buffer, 0, bufferSize);
}
}
}
}
catch (Exception ex)
{
LogHelper.WriteLog(logs, "Errore Upload", ex);
throw;
}
}
FTP-клиент подключается, пишет и закрывается корректно без каких-либо ошибок. Но записанные файлы повреждены, например, PDF невозможно открыть, а для DOC/DOCX Word отображается сообщение о повреждении файла и пытается восстановить его.
Если я пишу в файл те же байты, переданные методу загрузки, я получаю правильный файл. Поэтому проблема должна быть связана с FTP-передачей.
byte[] fileBytes = memoryStream.ToArray();
File.WriteAllBytes(@"C:\test.pdf", fileBytes); // --> File OK!
ftpClient.Upload(fileBytes, remoteFile); // --> File CORRUPTED on FTP folder!
Является ли файл, прибывающий на другом конце точно такой же длины? любой шанс, что он усекает немного раньше? – BugFinder