2013-08-31 2 views
3

J'ai un pictureBox et un bouton sur le formulaire1. Lorsque le bouton est cliqué, il doit télécharger le fichier sur le serveur. Pour l'instant j'utilise la méthode ci-dessous. Tout d'abord enregistrer l'image localement, puis télécharger sur le serveur:Télécharger l'image vers un serveur à partir de PictureBox

Bitmap bmp = new Bitmap(this.form1.pictureBox1.Width, this.form1.pictureBox1.Height); 
Graphics g = Graphics.FromImage(bmp); 
Rectangle rect = this.form1.pictureBox1.RectangleToScreen(this.form1.pictureBox1.ClientRectangle); 
g.CopyFromScreen(rect.Location, Point.Empty, this.form1.pictureBox1.Size); 
g.Dispose(); 
bmp.Save("filename", ImageFormat.Jpeg); 

Et puis télécharger ce fichier:

using (var f = System.IO.File.OpenRead(@"F:\filename.jpg")) 
{ 
    HttpClient client = new HttpClient(); 
    var content = new StreamContent(f); 
    var mpcontent = new MultipartFormDataContent(); 
    content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
    mpcontent.Add(content); 
    client.PostAsync("http://domain.com/upload.php", mpcontent); 
} 

Je ne peux pas utiliser le type Bitmap dans StreamContent. Comment puis-je diffuser directement l'image à partir de PictureBox plutôt que de l'enregistrer en tant que fichier en premier?

Je suis arrivé avec le code ci-dessous en utilisant MemoryStream, mais la taille du fichier téléchargé est 0 en utilisant cette méthode. Pourquoi?

byte[] data; 

using (MemoryStream m = new MemoryStream()) 
{ 
    bmp.Save(m, ImageFormat.Png); 
    m.ToArray(); 
    data = new byte[m.Length]; 
    m.Write(data, 0, data.Length); 

    HttpClient client = new HttpClient(); 
    var content = new StreamContent(m); 
    var mpcontent = new MultipartFormDataContent(); 
    content.Headers.ContentType = new MediaTypeHeaderValue("image/png"); 
    mpcontent.Add(content, "file", filename + ".png"); 
    HttpResponseMessage response = await client.PostAsync("http://domain.com/upload.php", mpcontent); 
    //response.EnsureSuccessStatusCode(); 
    string body = await response.Content.ReadAsStringAsync(); 
    MessageBox.Show(body); 
} 
+0

Enregistrer l'image vers un MemoryStream, puis téléchargez les octets sauvegardant ce MemoryStream. – EricLaw

+0

laissez-moi vérifier, merci – user969068

+0

Je suis désolé, mais je ne pouvais pas comprendre comment enregistrer bmp dans MemoryStream. data = nouvel octet [bmp.NOTSURE]; m.Écrire (données, 0, données.Longueur); – user969068

Répondre

1

Je ne sais pas si elle est la bonne façon de le faire, mais je l'ai résolu en créant un nouveau flux, puis copier le plus ancien à elle:

using (MemoryStream m = new MemoryStream()) 
{ 
    m.Position = 0; 
    bmp.Save(m, ImageFormat.Png); 
    bmp.Dispose(); 
    data = m.ToArray(); 
    MemoryStream ms = new MemoryStream(data); 
    // Upload ms 
} 
0
Image returnImage = Image.FromStream(....); 
+0

Merci, mais s'il vous plaît vérifier ma question mise à jour. – user969068

Questions connexes