Kom ihåg mig?
Home Menu

Menu


Ta emot bild via POST-anrop

 
Ämnesverktyg Visningsalternativ
Oläst 2008-06-18, 17:20 #1
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
Jag kör C#/ASP.NET 3.5 och vill ta emot en uppladdad bild från en källa utanför C#-applikationen. Jag gör ett POST-anrop till en .ashx-sida där jag vill ta hand om bilden för att sedan kunna spara i databasen. Har försökt på olika sätt, men lyckas inte riktigt få till det.

Kod:
// ImageHandler.ashx

public class ImageHandler : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
    Stream stream = context.Request.InputStream;

    //Image image = Image.FromStream(stream);

    byte[] bytes = new byte[stream.Length];
    stream.Read(bytes, 0, bytes.Length);
    string str = Convert.ToBase64String(bytes);
  }
}
Den bortkommenterade raden ger ArgumentException, "Parametern är inte giltig", så det fungerar uppenbarligen inte.

Om jag tar innehållet i str och "decodar" på http://www.toastedspam.com/decode64 så får jag fram följande

Kod:
----------11a9bf2ff31--------21523374577461
Content-Disposition: form-data; name="myImage"; filename="theFilename.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABTAHQDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
  (forts...)
Alltså lyckas ju överföringen i någon mening - det jag vill ha tag på "finns" ju... Men hur gör jag för att få ut datan (i det här fallet bilden) som är kodad här så att jag kan använda den i C#?

EDIT:
Använder man FileUpload-kontrollen i ASP.NET är det självklart inga problem att "hitta" bilden, då funkar det utmärkt med
Kod:
Image image = Image.FromStream(FileUpload1.PostedFile.InputStream);
Men i detta fall kommer alltså POST-anropet inte från ASP.NET-applikationen. Tips på lösningar på motsvarande problem i andra miljöer (t.ex. php) är också intressanta!
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-18, 17:46 #2
KarlRoos KarlRoos är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2007
Inlägg: 1 416
KarlRoos KarlRoos är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2007
Inlägg: 1 416
Jag har själv haft problem när jag inte fattat vad problemet varit (i PHP då).

Tillslut kom jag på att jag hade glömt <form enctype="multipart/form-data" action="?post" method="POST"> <_<
KarlRoos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-18, 17:51 #3
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
context.Request.ContentType = "multipart/form-data; boundary=--------11a9bf2ff31--------21523374577461" så jag tror inte det är problemet.
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-18, 19:26 #4
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Jake.Nu Jake.Nu är inte uppkopplad
Medlem
 
Reg.datum: Oct 2006
Inlägg: 224
Ser ut som du gör om datan som kommer till base64 ytterligare en gång?

Kod:
string str = Convert.ToBase64String(bytes);
Filen som skickas från sändande part är väl redan i base64-format?

Kod:
string str = Convert.FromBase64String(bytes);
känns mer rätt (om den funktionen ens finns).
Jake.Nu är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-18, 22:23 #5
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
Rätt svar:


Kod:
    HttpPostedFile htf = context.Request.Files[0];
    System.IO.Stream stream = htf.InputStream;
    System.Drawing.Image im = System.Drawing.Image.FromStream(stream);
digiArt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-19, 00:01 #6
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
digiArt:
Det är ju en rätt naturlig lösning, så jag har redan försökt. Problemet är att context.Request.Files är tom...


Jake.Nu:
Convert.ToBase64String() gör om en byte[] till en string.
Citat:
"Converts an array of 8-bit unsigned integers to its equivalent String representation encoded with base 64 digits. ...
The elements of inArray are taken as a numeric value and converted to a String representation encoded with base 64 digits."
http://msdn.microsoft.com/en-us/library/dhx0d524.aspx
Det finns också Convert.FromBase64String() som gör om en string till en byte[].
Citat:
"Converts the specified String, which encodes binary data as base 64 digits, to an equivalent 8-bit unsigned integer array."
http://msdn.microsoft.com/en-us/library/sy...se64string.aspx
Det jag får fram i variabeln str i mitt första inlägg är hela innehållet i post-anropet i kodad form. Convert.ToBase64String gör bara om det från binär form till en sträng. I klartext är det en massa tecken i en följd.
Kod:
LS0tLS0tLS0tLTExYTlkOWVhYmI5LS0tLS0tLS0yMTUyMzU0NzUyNTY3MQ0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJwYXN0ZWRJbWFnZSI7IGZpbGVuYW1lPSJ0aGVGaWxlbmFtZS5qcGciDQp (forts...)
Om jag, som jag beskrev i första inlägget, kör denna sträng i en base64-decoder (http://www.toastedspam.com/decode64) får jag det resultat som jag också visade i mitt första inlägg. Där ser man först i klartext headern med Content-Disposition, Content-Type m.m. Därefter kommer själva bilden kodad i base64. Och om jag klipper ut bara den texten och kör i http://www.toastedspam.com/decode64 igen så visas faktiskt bilden, så det stämmer.

För att sammanfatta, det jag får fram ur context.Request.InputStream måste först base64-decodas en gång för att skilja ut headers och själva datan. Denna data måste sedan base64-decodas en gång till för att få själva bilden. Det är lätt att tappa bort sig här...

Det konstiga är ju att ASP.NET lyckas tyda headerinformationen, för den finns med i bl.a. context.Request.ContentType och context.Request.Headers, men context.Request.Files är som sagt tom.

Någon funktion för konvertering motsvarande den som görs på http://www.toastedspam.com/decode64 har jag inte hittat i .NET, ännu i alla fall.

Någon som har fler bra idéer?
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-19, 08:33 #7
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
digiArt digiArt är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jan 2004
Inlägg: 1 429
Jag hade också problem med att Request.Files var tom, men sätt ett namn på input-fältet så löser det sig.
digiArt är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-19, 09:34 #8
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
digiArt, tack för att du engagerar dig, men titta i mitt första inlägg. Efter ett par varv i base64-decodern får jag fram följande
Kod:
----------11a9bf2ff31--------21523374577461
Content-Disposition: form-data; name="myImage"; filename="theFilename.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABTAHQDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
  (forts...)
Raden med Content-Disposition innehåller väl det som motsvarar namnet på inputfältet, här "myImage", eller?

Sedan är ju saken också den att anropet inte kommer från ett vanligt html-formulär, utan en javaapplet. Kan det vara i den änden problemet ligger?
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-19, 14:33 #9
funcall funcall är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2006
Inlägg: 41
funcall funcall är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2006
Inlägg: 41
Borde inte detta funka?
Kod:
StreamReader sra = New StreamReader(context.Request.InputStream, System.Text.Encoding.UTF8);
System.Drawing.Image fullSizeImg = System.Drawing.Image.FromStream(sra.BaseStream);
funcall är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-06-19, 15:07 #10
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
Tack för tipset, funcall! Jag får System.ArgumentException "Parametern är inte giltig." när jag provar ditt förslag, men det ger åtminstone några nya uppslag att experimentera vidare med.

Jag har i alla fall lyckats få in filen i context.Request.Files nu...
etanders är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 00:57.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017