web-dev-qa-db-fra.com

FileUpload vers FileStream

Je suis en train d'envoyer le fichier avec HttpWebRequest. Mon fichier proviendra de FileUpload UI. Ici, je dois convertir le téléchargement de fichiers en flux de fichiers pour envoyer le flux avec HttpWebRequest. Comment convertir FileUpload en flux de fichiers?

15
Gopi

Étant donné que FileUpload.PostedFile.InputStream me donne Stream, j'ai utilisé le code suivant pour le convertir en tableau d'octets

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[input.Length];
    //byte[] buffer = new byte[16 * 1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}
26
Gopi

Il pourrait être préférable de diriger le flux d'entrée directement vers le flux de sortie:

inputStream.CopyTo(outputStream);

De cette façon, vous ne mettez pas le fichier entier en cache avant la retransmission. Par exemple, voici comment l'écrire dans un FileStream:

FileUpload fu;  // Get the FileUpload object.
using (FileStream fs = File.OpenWrite("file.dat"))
{
    fu.PostedFile.InputStream.CopyTo(fs);
    fs.Flush();
}

Si vous souhaitez l'écrire directement dans une autre demande Web, vous pouvez procéder comme suit:

FileUpload fu; // Get the FileUpload object for the current connection here.
HttpWebRequest hr;  // Set up your outgoing connection here.
using (Stream s = hr.GetRequestStream())
{
    fu.PostedFile.InputStream.CopyTo(s);
    s.Flush();
}

Cela sera plus efficace, car vous diffuserez directement le fichier d'entrée sur l'hôte de destination, sans mise en cache préalable en mémoire ou sur disque.

11
Extremeswank

Vous ne pouvez pas convertir un FileUpload en FileStream. Vous pouvez cependant obtenir un MemoryStream à partir de la propriété PostedFile de FileUpload. Vous pouvez ensuite utiliser ce MemoryStream pour remplir votre HttpWebRequest.

3
ErikHeemskerk

Vous pouvez placer un fichier FileUpload directement dans un MemoryStream en utilisant FileBytes (réponse simplifiée de Tech Jerk)

using (MemoryStream ms = new MemoryStream(FileUpload1.FileBytes))
{
    //do stuff 
}

Ou si vous n'avez pas besoin d'un MemoryStream

byte[] bin = FileUpload1.FileBytes;
3
VDWWD