Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to send an image over Java HTTP server

Tags:

java

http

I'm developing an HTTP server using HttpServer and HttpHandler.

The server should response to clients with XML data or images.

So far, I have developed HttpHandler implementations which respond to the clients with the XML data but I couldn't implement a HttpHandler which reads the image from file and send it to the client (e.g., a browser).

The image should not be loaded fully into memory so I need some kind of streaming solution.

public class ImagesHandler implements HttpHandler {
    @Override
    public void handle(HttpExchange arg0) throws IOException {
        File file=new File("/root/images/test.gif");
        BufferedImage bufferedImage=ImageIO.read(file);

        WritableRaster writableRaster=bufferedImage.getRaster();
        DataBufferByte data=(DataBufferByte) writableRaster.getDataBuffer();

        arg0.sendResponseHeaders(200, data.getData().length);
        OutputStream outputStream=arg0.getResponseBody();
        outputStream.write(data.getData());
        outputStream.close();
    }
}

This code just sends 512 bytes of data to the browser.

like image 248
Mohammad Daei Avatar asked Nov 12 '14 05:11

Mohammad Daei


1 Answers

You're doing way too much work here: decoding the image, and storing it in memory. You shouldn't try to read the file as an image. That is useless. All the browser needs is the bytes that are in the image file. So you should simply send the bytes in the image file as is:

File file = new File("/root/images/test.gif");
arg0.sendResponseHeaders(200, file.length());
// TODO set the Content-Type header to image/gif 

OutputStream outputStream=arg0.getResponseBody();
Files.copy(file.toPath(), outputStream);
outputStream.close();
like image 116
JB Nizet Avatar answered Oct 23 '22 02:10

JB Nizet