簡體   English   中英

如何減少java中多部分文件的大小

[英]How to reduce size of a multipart file in java

我有Java Spring MVC應用程序,其中有一個選項可以上傳圖像並保存到服務器。 我有以下方法:

@RequestMapping(value = "/uploaddocimagecontentsubmit", method = RequestMethod.POST)
public String createUpdateFileImageContentSubmit(@RequestParam("file") MultipartFile file, ModelMap model)
{
//methods to handle file upload
}

我現在正在嘗試參考以下內容來減小圖像的大小:

increas-resolution-and-reducing-size-of-an-image-in-javareduce-image-resolution-in-java我面臨的問題是,在上面的例子中,我們正在處理java.io.File保存到指定位置的對象。 我不想保存圖像。 有什么方法可以使用類似的方法來壓縮我的多部分圖像文件並繼續上傳。

這是我第一次深入研究 ImageIO 包。 我遇到了MemoryCacheImageOutputStream,它允許您將圖像輸出流寫入輸出流,即ByteArrayOutputStream。 從那里,可以在壓縮后使用 toByteArray() 和 toString() 檢索數據。 我使用 toByteArray,因為我將圖像存儲到 postgresql 並將圖像存儲為字節數組。 我知道這已經晚了,但我希望它可以幫助某人。

private byte[] compressImage(MultipartFile mpFile) {
    float quality = 0.3f;
    String imageName = mpFile.getOriginalFilename();
    String imageExtension = imageName.substring(imageName.lastIndexOf(".") + 1);
    // Returns an Iterator containing all currently registered ImageWriters that claim to be able to encode the named format.
    // You don't have to register one yourself; some are provided.
    ImageWriter imageWriter = ImageIO.getImageWritersByFormatName(imageExtension).next();
    ImageWriteParam imageWriteParam = imageWriter.getDefaultWriteParam();
    imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // Check the api value that suites your needs.
    // A compression quality setting of 0.0 is most generically interpreted as "high compression is important,"
    // while a setting of 1.0 is most generically interpreted as "high image quality is important."
    imageWriteParam.setCompressionQuality(quality);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    // MemoryCacheImageOutputStream: An implementation of ImageOutputStream that writes its output to a regular
    // OutputStream, i.e. the ByteArrayOutputStream.
    ImageOutputStream imageOutputStream = new MemoryCacheImageOutputStream(baos);
    // Sets the destination to the given ImageOutputStream or other Object.
    imageWriter.setOutput(imageOutputStream);
    BufferedImage originalImage = null;
    try (InputStream inputStream = mpFile.getInputStream()) {
        originalImage = ImageIO.read(inputStream); 
    } catch (IOException e) {
        String info = String.format("compressImage - bufferedImage (file %s)- IOException - message: %s ", imageName, e.getMessage());
        logger.error(info);
        return baos.toByteArray();
    }
    IIOImage image = new IIOImage(originalImage, null, null);
    try {
        imageWriter.write(null, image, imageWriteParam);
    } catch (IOException e) {
        String info = String.format("compressImage - imageWriter (file %s)- IOException - message: %s ", imageName, e.getMessage());
        logger.error(info);
    } finally {
        imageWriter.dispose();
    }
    return baos.toByteArray();
}

為什么不在上傳前在客戶端調整它的大小? 這將節省一些帶寬

BlueImp JQuery Upload可以做到這一點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM