2017-05-04 4 views
0

Ich versuche authentifizierten Benutzern Bilder auf den Server über FTP hochladen. Der Code funktioniert größtenteils. Das Problem besteht darin, dass beim Hochladen der Datei ein Problem auftritt. Ich habe versucht ein paar verschiedene Bilder hochzuladen und alle sind größer auf dem Server und daher nicht richtig aufgebaut.VB.NET FTP Bild Upload Fehler

Ein Bild, das ich versuchte, ist 4,56 MB auf meinem Computer und 8.24 MB auf dem Server. Wenn ich das Bild in Photo lade, heißt es: "Wir können diese Datei nicht öffnen." Die Seite befindet sich unter http://troop7bhac.com/pages/slideshowedit.aspx. Der folgende VB.NET-Code hinter dem Upload lautet:

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 

Die Dateien werden über ein ASP.NET FileUpload-Steuerelement abgerufen. Das Steuerelement wurde so eingestellt, dass mehrere Dateien gleichzeitig zulässig sind.

Jede Hilfe, um herauszufinden, warum die Bilder nicht korrekt hochgeladen werden, würde sehr geschätzt werden.

EDIT: Ich versuchte Martin Prikryls mögliche doppelte Lösung. Musste es von C# zu VB.NET ändern. Es ging schief. Ich versuchte David Sdots Lösung und es scheiterte auch. Beide Lösungen gaben die gleichen Fehler zurück.

Wenn die Seite auf meinem lokalen Computer ausgeführt wurde, gab sie "C: \ Programme (x86) \ IIS Express \ PictureName.JPG" zurück. Wenn die Seite auf dem Server ausgeführt wurde, wurde "C: \ Windows \ SysWOW64 \ inetsrv \ PictureName.JPG" zurückgegeben. Beide Fehler gehören zur System.IO.FileNotFoundException-Klasse.

+0

Mögliches Duplikat [Zip-Datei nach dem Download vom Server in C# beschädigt zu werden] (http://stackoverflow.com/questions/41357267/zip-file-is-getting-corrupted-after-downloading-from -server-in-c-sharp) –

+0

Wenn Sie immer noch Probleme haben, schreiben Sie [mcve]. Eine einfache Konsolenanwendung, kein ASP. + Ich verstehe den hinzugefügten Abschnitt über Pfade und 'FileNotFoundException' nicht - wie hängt es mit der Frage zusammen? –

Antwort

1

Ihr Problem ist hier:

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

Ihr Bild als Text gelesen wird. Aus diesem Text erhalten Sie die Bytes UTF8 Byte Werte, deshalb ist Ihr Bild bei Uplaod fast doppelt so groß. Sie benötigen die Bytes aus dem Bild, ohne sie in etwas anderes umzuwandeln.

fileBytes = File.ReadAllBytes(file.FileName)