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

person Florian Schaal    schedule 31.10.2013    source источник
comment
Вы видели этот вопрос/ответ? stackoverflow.com/a/9738609/1346943   -  person Sven Grosen    schedule 31.10.2013
comment
@ledbutter Когда я загружаю файл с помощью веб-клиента, я получаю сообщение Удаленный сервер вернул ошибку: (553) Имя файла не разрешено.   -  person Florian Schaal    schedule 31.10.2013
comment
Какое имя файла?   -  person Tony    schedule 31.10.2013
comment
Особенно, что такое ftpPath + fileName + ".pdf"?   -  person mkl    schedule 31.10.2013
comment
@mkl что-то вроде 192.168.1.1/home/187520.pdf   -  person Florian Schaal    schedule 01.11.2013
comment
Вы пробовали с ftp:// перед этим? UploadFile ожидает URI.   -  person mkl    schedule 01.11.2013
comment
@mkl Перед ним есть ftp://, но если я наберу его здесь, он будет удален, потому что это ссылка.   -  person Florian Schaal    schedule 01.11.2013


Ответы (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.

person mkl    schedule 31.10.2013
comment
Хорошо, отлично, я научился работать с FileStream! Спасибо за информацию :) - person Florian Schaal; 01.11.2013