Ошибка ввода / вывода при открытии pdf после загрузки в ftp
Поэтому я пытаюсь загрузить файл на мой FTP-сервер. Кажется, что все работает, как ожидалось, но когда я открываю файл с FTP-сервера, я получаю ошибку ввода-вывода. Локальный файл работает просто отлично. Некоторые, как файл поврежден после загрузки. Я нашел подобную проблему здесь.
Здесь я прочитал, что вы должны изменить режим передачи на двоичный. Я пытался установить ftpRequest.UseBinary = true;
Но я все еще получаю ошибку ввода / вывода. Должен ли я изменить режим передачи где-нибудь?
Это мой код загрузки ftp:
public string upload(string remoteFile, string localFile)
{
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + "/" + remoteFile);
ftpRequest.UseBinary = true;
ftpRequest.Credentials = new NetworkCredential(user, pass);
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
// Copy the contents of the file to the request stream.
StreamReader sourceStream = new StreamReader(localFile);
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
sourceStream.Close();
ftpRequest.ContentLength = fileContents.Length;
Stream requestStream = ftpRequest.GetRequestStream();
requestStream.Write(fileContents, 0, fileContents.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)ftpRequest.GetResponse();
response.Close();
return string.Format("Upload File Complete, status {0}", response.StatusDescription);
}
Используя веб-клиент, я получаю сообщение об ошибке:
Удаленный сервер возвратил ошибку: (553) Имя файла не разрешено.
Вот мой код:
private void uploadToPDF(int fileName, string localFilePath, string ftpPath, string baseAddress)
{
WebClient webclient = new WebClient();
webclient.BaseAddress = baseAddress;
webclient.Credentials = new NetworkCredential(username, password);
webclient.UploadFile(ftpPath + fileName + ".pdf", localFilePath);
}
1 ответ
Ваш метод upload
Скорее всего, нарушает содержание PDF, потому что он обрабатывает его как текст:
Вы используете StreamReader
прочитать файл PDF. Этот класс
Реализует TextReader, который читает символы из потока байтов в определенной кодировке.
(Информация MSDN StreamReader)
Это подразумевает, что при чтении файловых байтов класс интерпретирует их в соответствии с этой конкретной кодировкой (UTF-8 в вашем случае, потому что это по умолчанию). Но не все комбинации байтов имеют смысл как комбинации символов UTF-8. Таким образом, это чтение уже разрушительно.
Вы частично восполните эту интерпретацию, перекодировав символы в соответствии с UTF-8 позже:
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
но, как было сказано ранее, первоначальная интерпретация, декодирование в виде файла в кодировке UTF-8, уже уничтожило исходный файл, если вам не повезло, и все комбинации байтов имели смысл как текст в кодировке UTF-8.
Для двоичных данных (таких как ZIP-архивы, документы Word или PDF-файлы) следует использовать FileStream
класс, ср. его информация MSDN.