2017-08-07 9 views
0

Ich habe seit Tagen damit zu kämpfen. Ich versuche, Funktionalität für jemanden zu erstellen, der einfach eine Image-Datei von ihrem lokalen Computer auf einen FTP-Server mit dem FileUpload-Steuerelement hochlädt. Das Problem ist, dass das FileUpload-Steuerelement den Pfad des Bildes, das vom Clientcomputer hochgeladen werden soll, nicht explizit abrufen kann. Daher kann ich den Quellpfad des Abbilds nicht dynamisch abrufen, wenn es von einem beliebigen Computer im Internet hochgeladen werden soll. Die einzige Möglichkeit, 'SORT OF' zu erhalten, ist der Pfad, oder besser gesagt, der Stream verwendet FileUpload.PostedFile.inputStream. Das Problem dabei ist jedoch, das Bild in ein Byte-Array umzuwandeln. Die Funktionalität, nach der ich bisher gesucht habe, hat alle die Datei auf den Server mit 0 Bytes hochgeladen. Wenn ich StreamReader (FileUpload.PostedFile.InputStream) verwende und Bytes durch Kodierung mit UTF8 erhalte, hat das hochgeladene Bild Bytes, aber größer als die ursprüngliche Datei und das Bild ist beschädigt.Wie konvertiert man Stream zu Byte()

Im Folgenden ist der Kodex im

Public Sub Upload() 
    'FTP Server URL. 
    Dim ftp As String = "ftp://winhost1.axxesslocal.co.za" 

    'FTP Folder name. Leave blank if you want to upload to root folder. 
    Dim ftpFolder As String = "/httpdocs/images/" 

    Dim fileBytes As Byte() = Nothing 

    'Read the FileName and convert it to Byte array. 
    Dim fileName As String = Path.GetFileName(ImageUpload.FileName) 
    Using fileStream As New StreamReader(ImageUpload.PostedFile.InputStream) 

     fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd()) 
     fileStream.Close() 
    End Using 

    'Create FTP Request. 
    Dim request As FtpWebRequest = DirectCast(WebRequest.Create(ftp & ftpFolder & fileName), FtpWebRequest) 
     request.Method = WebRequestMethods.Ftp.UploadFile 

     'Enter FTP Server credentials. 
     request.Credentials = New NetworkCredential("******", "******") 
     request.ContentLength = fileBytes.Length 
     request.UsePassive = True 
     request.UseBinary = True 
     request.ServicePoint.ConnectionLimit = fileBytes.Length 
     request.EnableSsl = False 

    Using requestStream As Stream = request.GetRequestStream() 
      requestStream.Write(fileBytes, 0, fileBytes.Length) 
      requestStream.Close() 
     End Using 

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


     response.Close() 

End Sub 

hochladen mit weiß, dass ich das Problem hier ist fileBytes = Encoding.UTF8.GetBytes (fileStream.ReadToEnd())

Aber ich weiß nicht, wie sonst um ImageUpload.PostedFile.InputStream() in Bytes zu konvertieren, die mir ein unverzerrtes Bild geben.

Antwort

0

Sie müssen weder UTF-Codierung oder -Decodierung durchführen, noch benötigen Sie einen StreamReader. Greifen Sie einfach die Bytes.

fileStream = ImageUpload.PostedFile.InputStream 
Dim fileBytes(0 to fileStream.Length - 1) as Byte 
fileStream.Read(fileBytes, 0, fileBytes.Length) 
fileStream.Close() 

Oder wenn Sie den Puffer als Rückgabewert zu erhalten, können Sie verwenden, um ein BinaryReader:

Using binaryReader As New BinaryReader(ImageUpload.PostedFile.InputStream) 
    fileBytes = binaryReader.ReadBytes(binaryReader.BaseStream.Length) 
    binaryReader.Close() 
End Using 
+0

filestream müssen nicht eine .length Methode haben –

+0

Was ist [diese] (https: // msdn.microsoft.com/en-us/library/system.io.filestream.length(v=vs.110).aspx) dann? –

+0

Das ist die Verwendung der FileStream-Klasse. Die Variable fileStream oben ist vom Typ StreamReader –

Verwandte Themen