2017-08-07 3 views
0

J'ai lutté avec cela pendant des jours. J'essaye de créer la fonctionnalité pour que quelqu'un télécharge simplement un fichier d'image de leur machine locale à un serveur FTP using le contrôle de FileUpload. Le problème est, le contrôle FileUpload ne peut pas récupérer explicitement le chemin de l'image à télécharger à partir de la machine client, et donc je ne peux pas obtenir dynamiquement le chemin source de l'image si elle devait être téléchargée depuis n'importe quel pc sur le net. La seule façon de 'SORT OF' obtenir le chemin, ou plutôt le flux utilise FileUpload.PostedFile.inputStream. Le problème avec ceci est cependant la conversion de l'image en un tableau d'octets. La fonctionnalité que j'ai recherché jusqu'ici pour le faire ont tous téléchargé le fichier sur le serveur avec 0 octets. Si j'utilise StreamReader (FileUpload.PostedFile.InputStream) et que j'obtiens des octets en encodant avec UTF8, l'image téléchargée a des octets mais plus grands que le fichier original et l'image est corrompue.Comment convertir Stream en octets()

Ce qui suit est le code im utiliser pour télécharger

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 

Je sais que la question est ici fileBytes = Encoding.UTF8.GetBytes (fileStream.ReadToEnd())

Mais je ne sais pas comment les autres convertir ImageUpload.PostedFile.InputStream() en octets qui me donnera une image non déformée.

Répondre

0

Vous n'avez pas besoin de faire de codage ou de décodage UTF, ni de StreamReader. Attrape juste les octets.

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

Ou si vous préférez recevoir le tampon comme une valeur de retour, vous pouvez utiliser un BinaryReader:

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

fileStream ne marche pas avoir une méthode .length –

+0

Quelle est [ce] (https: // msdn.microsoft.com/en-us/library/system.io.filestream.length(v=vs.110).aspx) alors? –

+0

Cest en utilisant la classe FileStream. La variable fileStream ci-dessus est de type StreamReader –