Повреждение загрузки изображения сервлета Java (серое дно) - PullRequest
1 голос
/ 10 ноября 2010

У нас есть сервлет, который принимает загрузки изображений.Иногда, когда загрузка происходит в нашем клиенте iPhone (нестабильное соединение), сохраненное изображение может оказаться частично или полностью серым.Я подозреваю, что это связано с преждевременным обрывом соединения и тем, что сервлет завершает обработку неполного изображения.

Какое лекарство от этого лучшее?Есть ли способ узнать, было ли загружено все изображение перед обработкой?Должен ли я использовать HTTP-заголовок Content-Length и сравнить, что загружено с этим номером?

Спасибо!

Некоторый код для контекста:

@Path("images/")
@POST
@Consumes("image/*")
@Produces({"application/xml", "application/json"})
public AbstractConverter postImage(byte[] imageData) {

    BufferedImage bufferedImage = null;
    try {
        bufferedImage = ImageIO.read(new ByteArrayInputStream(imageData));
    } catch (Exception e) {
    }
    if (bufferedImage == null) {
        throw new PlacesException("Image data not provided or could not be parsed", Response.Status.BAD_REQUEST);
    }

...

    BufferedImage scaledImage = ImageTool.scale(bufferedImage, imageSize);
    BufferedImage thumbnail = ImageTool.scale(bufferedImage, thumbnailSize);

    //Save image and thumbnail
    File outputfile = new File(path);
    ImageTool.imageToJpegFile(scaledImage, outputfile, 0.9f);
    File tnOutputfile = new File(thumbnailPath);
    ImageTool.imageToJpegFile(thumbnail, tnOutputfile, 0.9f);

...

public static void imageToJpegFile(RenderedImage image, File outFile, float compressionQuality) throws IOException {

    //Find a jpeg writer
    ImageWriter writer = null;
    Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg");
    if (iterator.hasNext()) {
        writer = iterator.next();
    } else {
        throw new RuntimeException("No jpeg writer found");
    }


    //Set the compression quality
    ImageWriteParam params = writer.getDefaultWriteParam();
    params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    params.setCompressionQuality(compressionQuality);

    //Write to the out file
    ImageOutputStream ios = null;
    try {
        ios = ImageIO.createImageOutputStream(outFile);
        writer.setOutput(ios);
        writer.write(null, new IIOImage(image, null, null), params);

    } finally {
        writer.dispose();
        if (ios != null) {
            try {
                ios.flush();
            } catch (Exception e) {
            }
            try {
                ios.close();
            } catch (Exception e) {
            }
        }

    }
}

1 Ответ

0 голосов
/ 10 ноября 2010

Похоже, что загрузка не завершена должным образом.

Как вы сами указали, лучше всего использовать заголовок HTTP Content-Length, чтобы убедиться, что все данные получены. Если нет, откажитесь от изображения.

...