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 コンテンツを破損する可能性が最も高いです。

を使用し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 情報

于 2013-10-31T19:14:20.750 に答える