FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
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); } } 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...) 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); |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Har WN som tidsfördriv
|
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"> <_< |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
context.Request.ContentType = "multipart/form-data; boundary=--------11a9bf2ff31--------21523374577461" så jag tror inte det är problemet.
|
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
Ser ut som du gör om datan som kommer till base64 ytterligare en gång?
Kod:
string str = Convert.ToBase64String(bytes); Kod:
string str = Convert.FromBase64String(bytes); |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Har WN som tidsfördriv
|
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); |
||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Medlem
|
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:
Citat:
Kod:
LS0tLS0tLS0tLTExYTlkOWVhYmI5LS0tLS0tLS0yMTUyMzU0NzUyNTY3MQ0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJwYXN0ZWRJbWFnZSI7IGZpbGVuYW1lPSJ0aGVGaWxlbmFtZS5qcGciDQp (forts...) 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? |
||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Har WN som tidsfördriv
|
Jag hade också problem med att Request.Files var tom, men sätt ett namn på input-fältet så löser det sig.
|
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Medlem
|
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...) 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? |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Nykomling
|
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); |
||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Medlem
|
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... |
||
![]() |
![]() |
Svara |
|
|