0

次のコードを使用してファイルをFTPにアップロードすると、ファイルがアップロードされます。問題はxls、pdf、およびビデオファイルにあり、破損します。Txt、sqlはそのまま残ります、私はこれをFTPで直接チェックしました。UTF8.GetBytesと関係があると思いますか?コードは以下のとおりです

                Dim URI As String = Url & "/" & fileName
                Dim ftp As System.Net.FtpWebRequest = CType(FtpWebRequest.Create(URI), FtpWebRequest)
                ftp.Credentials = New System.Net.NetworkCredential(Username, Password)
                ftp.Proxy = Nothing
                ftp.KeepAlive = False
                ftp.UsePassive = False
                ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile

                Dim sourceStream As New StreamReader(file.InputStream)
                Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())
                sourceStream.Close()


                ftp.ContentLength = fileContents.Length
                ftp.UsePassive = True

                Dim requestStream As Stream = ftp.GetRequestStream()
                requestStream.Write(fileContents, 0, fileContents.Length)
                requestStream.Close()

                Dim response As FtpWebResponse = DirectCast(ftp.GetResponse(), FtpWebResponse) 

どんな助けでも大歓迎です。

4

1 に答える 1

1

これが問題です:

Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())

ストリームをUTF-8でエンコードされたテキストであるかのように文字列として読み取ってから、再度バイトに変換します。なぜあなたはこれをしますか?問題のファイルUTF-8でエンコードされたテキストではないため、そのように扱うべきではありません。

ストリームからバイナリデータを読み取ります。実際テキストデータであることが確実でない限り、テキストに変換しないでください。ここでのタイプは明確ではありませんが、すべてをメモリに読み込まに長さを取得できることを願っています。その後、次を使用できます。file

file.InputStream.CopyTo(requestStream)

すべてのデータをコピーします。Using例外がスローされた場合にストリームを開いたままにしないように、手動でストリームを閉じるのではなく、ステートメントを使用する必要があることに注意してください。

于 2012-11-26T15:53:36.607 に答える