最近、ASP.NET での FTP アップロードに関する記事をたくさん読んでいますが、それらはすべて理にかなっているように見えますが、それらを実装しようとするたびに、空のファイルがアップロードされるか、ファイルがまったくアップロードされません。ここに私が読んでいる記事のいくつかがあります:
- ASP.NET Web ページからの FTP 転送の管理John Peterson 著
- FileUpload コントロールがフル パスを提供しない….HELP!!!!
- 方法: FileUpload Web サーバー コントロールを使用してファイルをアップロードする
それらはすべて素晴らしい記事ですが、私が言ったように、問題があります:(
問題が何であるかは正確にわかっていますが、それを修正する方法がわかりません。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 に感謝します。このスレッドを見つけた他の人が利益を得られるように、私の失態をここに残しておきます ;)