I/O грешка при отваряне на pdf след качване на ftp

Така че се опитвам да кача файл на моя ftp сървър. Всички неща изглежда работят според очакванията, но когато отворя файла от ftp, получавам I/O грешка. Локалният файл работи добре. Някои начини, по които файлът се поврежда след качване. Открих подобен проблем тук.

Тук прочетох, че трябва да промените режима на прехвърляне на двоичен. Опитах се да задам ftpRequest.UseBinary = true;, но все още получавам I/O грешка. Трябва ли да променя някъде режима на прехвърляне?

Това е моят код за качване на 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