Ошибка ввода / вывода при открытии 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.

Другие вопросы по тегам