2017-05-04 11 views
0

認証されたユーザーがFTP経由でサーバーに画像をアップロードできるようにしようとしています。このコードはほとんどの部分で機能します。そうでない部分は、ファイルをアップロードする際に問題があるということです。私はいくつかの異なる画像をアップロードしようとしており、そのすべてがサーバ上でより大きく、したがって適切に構築されていません。VB.NET FTP画像アップロードエラー

私が試した1枚の画像は、自分のコンピュータで4.56MB、サーバーで8.24MBでした。写真に写真を読み込むと、「このファイルを開くことができません」と表示されます。ページの場所はhttp://troop7bhac.com/pages/slideshowedit.aspxです。以下は、アップロードの背後にあるVB.NETコードです。

Sub uploadFile_Click(sender As Object, e As EventArgs) 
    lblUploadErrors.InnerHtml = "" 
    If (lstSlideshowChoose.SelectedValue = "") Then 
     lblUploadErrors.InnerHtml = "<p>A slideshow must be selected.</p>" 
    Else 
     If (FileUpload1.HasFile) Then 
      Dim nameList() As String 
      Dim successList() As String 
      Dim i As Integer = 0 

      For Each file As HttpPostedFile In FileUpload1.PostedFiles 
       Dim fileBytes() As Byte = Nothing 
       Dim fileName As String = Path.GetFileName(file.FileName) 
       Dim photoRE As New Regex("^[A-z0-9 _]{1,}\.jpg|JPG|jpeg|JPEG|png|PNG+$") 
       Dim photoSuccess As Boolean = photoRE.Match(fileName).Success 

       ReDim Preserve nameList(i) 
       ReDim Preserve successList(i) 

       If (photoSuccess = True) Then 
        Using fileStream As New StreamReader(file.InputStream) 
         fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd()) 
         fileStream.Close() 
        End Using 
        Try 
         Dim request As FtpWebRequest = DirectCast(WebRequest.Create(ftpPath & lstSlideshowChoose.SelectedValue & "/" & fileName), FtpWebRequest) 

         request.Method = WebRequestMethods.Ftp.UploadFile 
         request.Credentials = New NetworkCredential(ftpUser, ftpPass) 
         Using uploadStream As Stream = request.GetRequestStream() 
          uploadStream.Write(fileBytes, 0, fileBytes.Length) 
          uploadStream.Close() 
         End Using 

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

         response.Close() 
         successList(i) = "Success " 
        Catch ex As Exception 
         successList(i) = "Failed " 
        End Try 
       Else 
        successList(i) = "Failed " 
       End If 
       nameList(i) = fileName 
       i += 1 
      Next 
      For x As Integer = 0 To nameList.Count - 1 
       lblUploadErrors.InnerHtml += "<p>" & successList(x) & nameList(x) & "</p>" 
      Next 
     Else 
      lblUploadErrors.InnerHtml = "<p>You have not selected a picture to upload.</p>" 
     End If 
    End If 
End Sub 

ファイルはASP.NET FileUploadコントロールから取得されます。コントロールは、複数のファイルを一度に許可するように設定されています。

写真が正しくアップロードされない理由を理解する助けがあれば、大歓迎です。

EDIT:私はMartin Prikrylの可能な複製ソリューションを試しました。それをC#からVB.NETに変更しなければなりませんでした。それは失敗した。私はDavid Sdotのソリューションを試しましたが、失敗しました。両方のソリューションが同じエラーを返しました。

ページがローカルマシンで実行された場合、「C:\ Program Files(x86)\ IIS Express \ PictureName.JPG」が返されます。ページがサーバー上で実行された場合、「C:\ Windows \ SysWOW64 \ inetsrv \ PictureName.JPG」が返されます。どちらのエラーも、System.IO.FileNotFoundExceptionクラスのエラーです。

+0

の可能性のある重複した[Zipファイルは、C#で、サーバーからダウンロードした後に壊れてきている](http://stackoverflow.com/questions/41357267/zip-file-is-getting-corrupted-after-downloading-from -server-in-c-sharp) –

+0

まだ問題がある場合は、[mcve]を投稿してください。単純なコンソールアプリケーションで、ASPはありません。 +私はパスと 'FileNotFoundException'についての追加されたセクションを理解していません - どのように質問に関連していますか? –

答えて

1

あなたの問題はここにある:

Using fileStream As New StreamReader(file.InputStream) 
    fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd()) 
    fileStream.Close() 
Using 

あなたのイメージをテキストとして読み込まれます。このテキストからバイトUTF8バイト値が得られます。なぜなら、画像がuplaodedされたときのサイズの約2倍になっているからです。イメージからのバイトは、他のものに変換する必要はありません。

fileBytes = File.ReadAllBytes(file.FileName) 
関連する問題