WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Ta emot bild via POST-anrop (https://www.wn.se/forum/showthread.php?t=30010)

funcall 2008-06-19 15:52

Vad är det som felar? altså vilken rad?

etanders 2008-06-19 16:06

Just nu är läget detta...

Kod:

public void ProcessRequest(HttpContext context)
{
  var httpPostedFile = context.Request.Files[0];
  var path = ... // sökväg för att spara filen
  var streamReader = new StreamReader(httpPostedFile.InputStream, System.Text.Encoding.UTF8);
  var image = Image.FromStream(streamReader.BaseStream);

  try
  {
    image.Save(path);
  }
  catch (Exception e)
  {
    var bitmap = new Bitmap(image);
    bitmap.Save(path);
  }
}

image.Save() i try ger
Kod:

System.Runtime.InteropServices.ExternalException
"Ett allmänt fel uppstod i GDI+."

Däremot funkar bitmap.Save() i catch, och jag får en fil med rätt höjd och bredd, men innehållet är inte riktigt.

funcall 2008-06-19 16:11

Har du kollat så inputstreamen är UTF8 ?

etanders 2008-06-19 16:20

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.

funcall 2008-06-19 16:32

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);

etanders 2008-06-19 17:04

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 :)

digiArt 2008-06-19 17:09

Kod:


Image im = Bitmap.FromStream(stream);

im.Save(path);

Koden ovan är otestad, det är lite klipp och klistra från en funktion i min egen webbplats.

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.

etanders 2008-06-19 17:29

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");
originalImage.Save(path);

Detta funkar fint.

Jämförde också formatet hos bilderna
Kod:

image.RawFormat.Guid == originalImage.RawFormat.Guid == ImageFormat.Jpeg.Guid
bitmap.RawFormat.Guid == ImageFormat.MemoryBmp.Guid

Tror som sagt att det återstående problemet ligger i javaappleten och hur bilden kodas där innan den skickas.

Vimp 2008-06-21 23:53

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?

etanders 2008-06-23 11:37

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
  private void postImage(Image image)
  {
    BufferedImage buffImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    ImageIcon imageIcon = new ImageIcon(image);
    ImageObserver observer = imageIcon.getImageObserver();

    buffImage.getGraphics().setColor(new Color(255, 255, 255));
    buffImage.getGraphics().fillRect(0, 0, width, height);
    buffImage.getGraphics().drawImage(imageIcon.getImage(), 0, 0, observer);

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(stream);
    jpeg.encode(buffImage);

    URL url = new URL(m_postUrl);
    URLConnection connection = url.openConnection();
     
    String boundary = "--------" + Long.toHexString(System.currentTimeMillis()) + "--------" + Long.toOctalString(System.currentTimeMillis());
   
    connection.setRequestProperty("method", "POST");
    connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
   
    String output =
        "--" + boundary + "\r\n"
        + "Content-Disposition: form-data; name=\"theFirst\"\r\n"
        + "Content-Type: text/plain\r\n"
        + "Content-Transfer-Encoding: quoted-printable\r\n\r\n"
        + "Testar ett litet meddelande.\r\n"
        + "--" + boundary + "\r\n"
        + "Content-Disposition: form-data; name=\"pastedImage\"; filename=\"theFilename.jpg\"\r\n"
        + "Content-Type: image/jpeg\r\n"
        + "Content-Transfer-Encoding: base64\r\n\r\n"
        + Base64.encode(stream.toByteArray())
        //+ new String(stream.toByteArray())
        + "\r\n"
        + "--" + boundary + "--\r\n";
   
    connection.setDoOutput(true);
    connection.getOutputStream().write(output.getBytes());
    connection.connect();
  }

Jag har provat både med och utan base64-kodning (rad 7 från slutet), men vad jag väljer för argument i första raden (BufferedImage.TYPE_INT_RGB) påverkar resultatet i filen jag till slut får ut i .net. Tips, någon?


Alla tider är GMT +2. Klockan är nu 22:44.

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