![]() |
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 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 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); |
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"> <_< |
context.Request.ContentType = "multipart/form-data; boundary=--------11a9bf2ff31--------21523374577461" så jag tror inte det är problemet.
|
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); |
Rätt svar:
Kod:
HttpPostedFile htf = context.Request.Files[0]; |
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? |
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, 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 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? |
Borde inte detta funka?
Kod:
StreamReader sra = New StreamReader(context.Request.InputStream, System.Text.Encoding.UTF8); |
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... |
Vad är det som felar? altså vilken rad?
|
Just nu är läget detta...
Kod:
public void ProcessRequest(HttpContext context) Kod:
System.Runtime.InteropServices.ExternalException |
Har du kollat så inputstreamen är UTF8 ?
|
Nej, hur kan jag göra det?
Men jag har provat med alla varianter av Encoding; ASCII, BigEndianUnicode, Default, Unicode, UTF32, UTF7 och UTF8. Det är ingen skillnad alls. |
Ok du kan ju skriva ut och jämföra.
Annars kan du testa var streamReader = new StreamReader(httpPostedFile.InputStream); eller var streamReader = new StreamReader(httpPostedFile.InputStream, true); |
Troligen fungerar C#-koden jag har nu, men frågan är om bilden kodas på rätt sätt när den sänds från javaappleten.
Jag använder java.awt.image.BufferedImage och beroende på vad jag sätter för imageType i konstruktorn, så får jag olika förvrängda resultat i .NET-applikationen... Får läsa på och experimentera mera helt enkelt :) |
Kod:
Det som återstår är att kolla vilken typ av bild som du egentligen tar emot (om det är en bild öht, någon kanske skickar ett worddokument) för att sätta rätt ImageFormat. |
digiArt, det funkar inte. Blir samma fel som jag beskrev i inlägget kl 16.06.
Provade just att läsa in en jpg-fil direkt Kod:
var originalImage = Image.FromFile(context.Request.PhysicalApplicationPath + "image.jpg"); Jämförde också formatet hos bilderna Kod:
image.RawFormat.Guid == originalImage.RawFormat.Guid == ImageFormat.Jpeg.Guid |
Kan du inte skapa upp din request mot sidan du postar till själv i java-applikationen och bara skicka med den informationen som behövs?
|
Jo, det är just det jag vill göra (om jag förstår dig rätt).
Mitt första problem var att få till javakoden för requesten så att jag överhuvudtaget kom åt filen i .net-applikationen. Det lyckades till slut. Mitt problem nu är hur jag ska omvandla mitt java.awt.Image-objekt till någon form av strängrepresentation som kan överföras i requesten och som jag kan lyckas omvandla tillbaka till ett System.Drawing.Image-objekt i .net. Kod:
// Java |
Måste du posta den som en bild? Kan du inte bara posta som rådata och sedan låta .NET behandla den som en bild?
|
Visst, vilken typ av "rådata" skulle du rekommendera?
|
Jag tänkte att du kanske bara kan plocka ner alla bytes och skicka direkt till nästa sida. Som det är nu skapar du upp ett nytt Image-objekt med bilden. Du kan t.ex. plocka ner streamen, lagra direkt som en base64-enkodad sträng utifrån din byte-array och sedan göra tvärtom i .NET-applikationen. Dvs skippa hela biten med att spara om den som en bild i java.
|
Det jag har som utgångspunkt är Image-objektet i java. Hur konverterar man det bäst till en bytearray? Dessutom måste jag ju koda det som jpeg (eller annat bildformat) eftersom javas Image är en intern representation.
|
Måste du ta emot en Image i parametern? När du postar bilden till java-applikationen, får du då inte en byte-array? Den byte-arrayen kan du sedan skicka vidare utan modifikation och posta till nästa sida, antingen som den är, eller som t.ex. en base64-kodad sträng.
Genom att göra om den till ett objekt i java så måste du på något sätt serialisera den eller skapa en ny bild (som du gör nu). Det bästa är om du kan skicka vidare den som den är till .NET-applikationen. |
Fast grejen är att jag aldrig postar någon bild till javaapplikationen. "Originalet" är Image-objektet...
|
Ahaa, jag hade fått för mig att du laddade upp bilden till java-applikationen och bara skulle vidarebefordra den till ASP.NET-sidan. My mistake.
Om du tar base64-strängen direkt till ASP.NET-sidan och försöker visa (utan att posta från javan), kan du då visa upp bilden? |
Citat:
|
Du kanske kan ha en web service som tar emot din base64-sträng?
|
Alla tider är GMT +2. Klockan är nu 18:36. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson