如何在java中减小多部分文件的大小

如何在java中减小多部分文件的大小,java,image,spring-mvc,Java,Image,Spring Mvc,我有Javaspringmvc应用程序,其中有一个上传图像并保存到服务器的选项。我有以下方法: @RequestMapping(value = "/uploaddocimagecontentsubmit", method = RequestMethod.POST) public String createUpdateFileImageContentSubmit(@RequestParam("file") MultipartFile file, ModelMap model) { //method

我有
Java
springmvc
应用程序,其中有一个上传图像并保存到服务器的选项。我有以下方法:

@RequestMapping(value = "/uploaddocimagecontentsubmit", method = RequestMethod.POST)
public String createUpdateFileImageContentSubmit(@RequestParam("file") MultipartFile file, ModelMap model)
{
//methods to handle file upload
}
我现在尝试缩小图像的大小,参考以下内容:


我面临的问题是,在上述示例中,我们处理的是保存到指定位置的
java.io.File
对象。我不想保存图像。有没有什么方法可以让我使用类似的东西来压缩我的多部分图像文件并继续上载。

为什么不在上载之前在客户端调整它的大小?这将节省一些带宽


可以做到这一点

为什么不在上传之前在客户端调整它的大小?这将节省一些带宽


这是我第一次深入研究ImageIO软件包。我遇到了MemoryCacheMageOutputStream,它允许您将图像输出流写入输出流,即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();
}

这是我第一次深入研究ImageIO软件包。我遇到了MemoryCacheMageOutputStream,它允许您将图像输出流写入输出流,即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();
}

你完成了吗?@Hema,不,我还没有完成,你完成了吗?@Hema,不,我还没有完成