0

所以我试图将文件上传到我的 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);
}

使用 webclient 我得到错误:

远程服务器返回错误:(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);
}
4

1 回答 1

2

您的方法upload很可能会破坏 PDF 内容,因为它将其视为文本:

您使用 aStreamReader来阅读 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 信息

于 2013-10-31T19:14:20.750 回答