1

最近、ASP.NET での FTP アップロードに関する記事をたくさん読んでいますが、それらはすべて理にかなっているように見えますが、それらを実装しようとするたびに、空のファイルがアップロードされるか、ファイルがまったくアップロードされません。ここに私が読んでいる記事のいくつかがあります:

それらはすべて素晴らしい記事ですが、私が言ったように、問題があります:(

問題が何であるかは正確にわかっていますが、それを修正する方法がわかりません。FileUpload コントロールからファイル名を渡すことはできますが、セキュリティ上の理由からパスが存在しません。ただし、StreamReader オブジェクトは、アップロードするファイルの完全修飾パスを必要とします。私は頭が痛いです!>.<

上でリンクした John Peterson の例を使用してみましょう。コードは次のとおりです。

Protected Sub btnUploadFile_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim myFtpWebRequest As FtpWebRequest
    Dim myFtpWebResponse As FtpWebResponse
    Dim myStreamWriter As StreamWriter

    myFtpWebRequest = WebRequest.Create("ftp://ftp_server_name/filename.ext")
    myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile
    myFtpWebRequest.UseBinary = True

    myStreamWriter = New StreamWriter(myFtpWebRequest.GetRequestStream())

    'IT BREAKS HERE BECAUSE THE CLIENT PATH IS WRONG!!
    myStreamWriter.Write(New StreamReader(Server.MapPath("filename.ext")).ReadToEnd)
    myStreamWriter.Close()

    myFtpWebResponse = myFtpWebRequest.GetResponse()
    myFtpWebResponse.Close()
End Sub

見る?アップロードされたファイルにデータがありません:(

ここに画像の説明を入力

現在、私の最新の実装は次のようになっていますが、アップロードされたファイルはソースよりもはるかに大きく、破損しています。真剣に、私は一体何を間違っているのですか?私はこれに 2 日間長い時間を費やしました、うーん...

Protected Sub btnUploadFile2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim myFtpWebRequest As FtpWebRequest
    Dim myFtpWebResponse As FtpWebResponse

    filename = Path.GetFileName(FileUpload1.FileName)

    myFtpWebRequest = CType(WebRequest.Create(ftpServer + ftpPath + filename), FtpWebRequest)
    myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile
    myFtpWebRequest.UseBinary = True

    'NEW APPROACH USING THE STREAM OF THE FILE FROM THE FileUpload Control
    'CORRECT BYTE LENGTH - in sourceStream.BaseStream
    Dim sourceStream As New StreamReader(FileUpload1.FileContent)
    'WRONG BYTE LENGTH - in sourceStream.ReadToEnd()
    Dim fileContents As Byte() = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd())
    sourceStream.Close()
    myFtpWebRequest.ContentLength = fileContents.Length

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

    myFtpWebResponse = CType(myFtpWebRequest.GetResponse(), FtpWebResponse)
    myFtpWebResponse.Close()
End Sub

驚くべき答えをくれた Adam Maras に感謝します。このスレッドを見つけた他の人が利益を得られるように、私の失態をここに残しておきます ;)

4

3 に答える 3

1

ファイルをテキストのように読み取っているため、データが破損しますが、そうではありません。

a のBinaryReader代わりに a を使用しStreamReaderて、データをバイトとして直接読み取ることができます。

Dim fileContents As Byte()
Using sourceStream As New BinaryReader(FileUpload1.FileContent)
  fileContents = sourceStream.ReadBytes(Int32.MaxValue)
End Using
于 2011-10-13T23:32:58.457 に答える
1

このFileUpload.SaveAs()メソッドは、Web サーバーのローカル ファイル システムに保存し、URI または FTP サイトに書き込むことはできません。そのためには、WebRequest.

ここで FileUpload コントロールの MSDN リファレンスを参照してください: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.fileupload.saveas.aspx

ここで WebRequest を FTP で使用する場合: http://msdn.microsoft.com/en-us/library/ms229715.aspx


FileUpload ドキュメントに示されている例では、c:\temp\uploadedfiles に保存されます。代わりに使用することをお勧めします。Path.GetTempFileName()これは、環境に関係なく常に書き込むことができるファイルを提供することが保証されているためです。

于 2011-10-12T18:08:39.573 に答える
1

このように ASP.NET を使用する場合は、まず Web サーバー経由でアップロードする必要があります。クライアントのブラウザにプラグインをインストールするか、ActiveX コントロール (または同様のもの) を使用しない限り、クライアント マシンから FTP サーバーに直接アップロードすることは絶対にできません。

バイナリ ファイルをアップロードしていると仮定します。その場合、StreamReaders とStreamWriters の使用方法がファイルのバイナリ コンテンツを破損している可能性があります。代わりに、このメソッドを使用してStream.CopyTo、データを 1 つのストリームから別のストリームにそのまま移動できます。

代わりにこのパターンを使用するようにメソッドを変更しました:

Protected Sub btnUploadFile2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim myFtpWebRequest As FtpWebRequest
    Dim myFtpWebResponse As FtpWebResponse

    filename = Path.GetFileName(FileUpload1.FileName)

    myFtpWebRequest = CType(WebRequest.Create(ftpServer + ftpPath + filename), FtpWebRequest)
    myFtpWebRequest.Method = WebRequestMethods.Ftp.UploadFile
    myFtpWebRequest.UseBinary = True

    Dim myFileStream As Stream = FileUpload1.FileContent
    myFtpWebRequest.ContentLength = myFileStream.Length

    Dim requestStream As Stream = myFtpWebRequest.GetRequestStream()
    myFileStream.CopyTo(requestStream)
    requestStream.Close()

    myFtpWebResponse = CType(myFtpWebRequest.GetResponse(), FtpWebResponse)
    myFtpWebResponse.Close()
End Sub
于 2011-10-13T22:52:41.050 に答える