`

阿里云文件上传显示

    博客分类:
 
阅读更多

1、代码上传图片成功,浏览器直接访问下载问题:

(1)使用三级域名;

(2)指定上传文件的Content-Type(OSS jar包版本可能不一致,对号入座):

 

ObjectMetadata objectMeta = new ObjectMetadata();
objectMeta.setContentType("image/jpg");//在metadata中标记文件类型
objectMeta.setContentLength(out.toByteArray().length);

若在阿里云中设置,则点击文件右键设置HTTP头即可:

 



2、关于图片上传的显示:

图片路径+?x-oss-process=image/resize,m_fill,h_100,w_100  //可指定访问压缩尺寸的图片

图片路径+?x-oss-process=image/quality,q_20 //按像素压缩访问的图片

上述这些,可以用来对于已压缩上传图片,需要在app中显示时进一步调整。

不过,阿里云文档并没有提供压缩上传的功能,只针对在云上的图片显示做了很多丰富的处理。

 

3、图片上传压缩(参考一些上传,可以使用的)

第一次使用的是Thumbnailator,但不知道为什么不管怎么修改outputQuality(0.25f)值,虽然压缩了,但设置0.2和0.3效果并没有区别大小都没有变。没有试过压缩尺寸,这个不行也就没有再试了。

 

(1)原尺寸不变减少分辨率(对于大图片并不提倡,因为在手机上不忍直视,试过5M的,虽然压缩的可以,但失真严重,下面的方法对于png图片不可以,需要转换,暂时没有解决办法

https://stackoverflow.com/questions/15318677/how-do-i-write-a-bufferedimage-as-a-png-with-no-compression )

public class Test {
public static void main(String[] args) throws IOException {
       String endpoint = "";
       String accessKeyId = "";
       String accessKeySecret = "";
       String bucketName = "";//实际
       //key
       String key = "images/23_iso100_14mm6.jpg";
       InputStream fileStream = new FileInputStream("D:/23_iso100_14mm.jpg");
       ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
       byte[] buff = new byte[10485760]; //暂时上限10M
       int rc = 0;
       while ((rc = fileStream.read(buff, 0, 10485760)) > 0) {
           swapStream.write(buff, 0, rc);
       }
      
       byte[] tempByte = compressPicByQuality(swapStream.toByteArray(), 0.2f);
       InputStream sbs = new ByteArrayInputStream(tempByte); 
       OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
       ObjectMetadata objectMeta = new ObjectMetadata();
       objectMeta.setContentType("image/jpg");//在metadata中标记文件类型
       objectMeta.setContentLength(tempByte.length);
       ossClient.putObject(bucketName, key, sbs,objectMeta);
       
   }
   
    /**
     * @Title: compressPicByQuality @Description: 压缩图片,通过压缩图片质量,保持原图大小 @param quality:0-1 @return byte[] @throws
     */
    public static byte[] compressPicByQuality(byte[] imgByte, float quality) {
        byte[] inByte = null;
        try {
            ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
            BufferedImage image = ImageIO.read(byteInput);

            // 如果图片空,返回空
            if (image == null) {
                return null;
            }
            // 得到指定Format图片的writer
            Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");// 得到迭代器,jpg,jpeg
            ImageWriter writer = (ImageWriter) iter.next(); // 得到writer

            // 得到指定writer的输出参数设置(ImageWriteParam )
            //ImageWriteParam iwp = writer.getDefaultWriteParam();
            ImageWriteParam iwp = new JPEGImageWriteParam(null); 
            //ImageWriteParam iwp = new P
            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 设置可否压缩
            iwp.setCompressionQuality(quality); // 设置压缩质量参数

            iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);

            ColorModel colorModel = ColorModel.getRGBdefault();
            // 指定压缩时使用的色彩模式
            iwp.setDestinationType(
                    new javax.imageio.ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));

            // 开始打包图片,写入byte[]
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得内存输出流
            IIOImage iIamge = new IIOImage(image, null, null);

            // 此处因为ImageWriter中用来接收write信息的output要求必须是ImageOutput
            // 通过ImageIo中的静态方法,得到byteArrayOutputStream的ImageOutput
            writer.setOutput(ImageIO.createImageOutputStream(byteArrayOutputStream));
            writer.write(null, iIamge, iwp);
            inByte = byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            System.out.println("write errro");
            e.printStackTrace();
        }
        return inByte;
    }
}

 

(2)改变尺寸压缩(比较好些,暂时使用,不过对于png图片来说,压缩困难,有专门的国外付费软件,暂不考虑,下面会有jpg和png压缩后的比较,清晰度都还行)

public class Test {
public static void main(String[] args) throws IOException {
       String endpoint = "";
       String accessKeyId = "";
       String accessKeySecret = "";
       String bucketName = "";
       //key
       String key = "23_iso100_14mm6.jpg";
       InputStream fileStream = new FileInputStream("D:/23_iso100_14mm.jpg");
       ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
       byte[] buff = new byte[10485760]; //暂时上限10M
       int rc = 0;
       while ((rc = fileStream.read(buff, 0, 10485760)) > 0) {
           swapStream.write(buff, 0, rc);
       }
       ByteArrayInputStream in = new ByteArrayInputStream(swapStream.toByteArray());    //将b作为输入流;
       BufferedImage image = ImageIO.read(in);  
       //1500 1500 jpg 268kb png 2.27M
       //1000 1000 jpg 125kb png 1.27M(还是比较大的)
       ArrayList<Integer> arrayList = getAutoWidthAndHeight(image,1000,1000);
       int w = arrayList.get(0); 
       int h = arrayList.get(1);
       Image newImage = image.getScaledInstance(w, h,Image.SCALE_DEFAULT); 
       BufferedImage outputImage = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
       Graphics2D g = outputImage.createGraphics();
       g.drawImage(newImage, 0, 0, null); // 绘制缩小后的图
       g.dispose();
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       ImageIO.write(outputImage,"jpg",out);
       InputStream sbs = new ByteArrayInputStream(out.toByteArray()); 
       OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
       ObjectMetadata objectMeta = new ObjectMetadata();
       objectMeta.setContentType("image/jpg");//在metadata中标记文件类型
       objectMeta.setContentLength(out.toByteArray().length);
       ossClient.putObject(bucketName, key, sbs,objectMeta);      
   }
  
   	/*** 
	   * 
	   * @param bufferedImage 要缩放的图片对象 
	   * @param width_scale 要缩放到的宽度 
	   * @param height_scale 要缩放到的高度 
	   * @return 一个集合,第一个元素为宽度,第二个元素为高度 
	   */
	  public ArrayList<Integer> getAutoWidthAndHeight(BufferedImage bufferedImage,int width_scale,int height_scale){ 
	    ArrayList<Integer> arrayList = new ArrayList<Integer>(); 
	    int width = bufferedImage.getWidth(); 
	    int height = bufferedImage.getHeight(); 
	    if(width<=1000&&height<=1000){//限制不压缩(简陋版。。)
	        arrayList.add(width); 
            arrayList.add(height); 
	    }else{
	        double scale_w =getDot2Decimal( width_scale,width); 
	        System.out.println("getAutoWidthAndHeight width="+width + "scale_w="+scale_w); 
	        double scale_h = getDot2Decimal(height_scale,height); 
	        if (scale_w<scale_h) { 
	          arrayList.add(parseDoubleToInt(scale_w*width)); 
	          arrayList.add(parseDoubleToInt(scale_w*height)); 
	        } 
	        else { 
	          arrayList.add(parseDoubleToInt(scale_h*width)); 
	          arrayList.add(parseDoubleToInt(scale_h*height)); 
	        } 
	    }
	    return arrayList; 
	      
	  } 
}

 

  • 大小: 5.3 KB
分享到:
评论

相关推荐

    阿里云存储简易文件上传系统 v1.1 子目录版

    阿里云存储简易文件上传系统 SWFUPLOAD v1.1 根目录版基于S3上传版本改来的。 阿里云存储简易文件上传系统1.1 更新 增加了底部显示客户的IP,提示勿上传非法文件 阿里云SDK更新至最新版本 根目录和子目录分开 ...

    阿里云存储OSS操作示例(单、批量上传、删除、分页预览)

    在这个ASP.NET WEB版的阿里云操作示例中,用户可以学习如何通过编程接口进行OSS的各种操作,包括单文件上传、批量上传以及分页预览等关键功能。下面将详细介绍这些知识点。 1. **单文件上传** 单文件上传是指将一...

    阿里云oss web上传demo.rar

    通过这个Web上传Demo,开发者可以快速掌握阿里云OSS的Web上传功能,将其应用到实际项目中,为用户提供便捷的文件上传服务。在实际开发中,还需要根据项目需求进行定制,比如增加文件预览、文件类型限制、文件大小...

    AliossUploader:layui 阿里云OSS上传插件

    阿里云OSS上传插件AliossUploader是专门为layui框架设计的一个组件,它使得在layui应用中集成阿里云OSS的文件上传功能变得更加便捷。本文将详细讲解AliossUploader的使用方法、功能特性以及如何在实际项目中进行配置...

    js代码实现图片上传阿里云OSS

    在本文中,我们将深入探讨如何使用JS实现图片上传到阿里云对象存储服务(OSS)。阿里云OSS是一个高可用、高可靠的云存储服务,能够为开发者提供安全、稳定的数据存储解决方案。 首先,`plupload` 是一个开源的多...

    阿里云缺失字体文件导致乱码问题处理

    在使用阿里云ECS(Elastic Compute Service)服务时,可能会遇到一些意想不到的问题,其中之一就是文本或图片显示出现乱码。这种情况通常是由于服务器缺少必要的字体文件导致的。本篇文章将详细探讨这一问题,并提供...

    ali-audio-to-srt阿里云音频转字幕

    - **上传音频**:首先,用户需要将要转换的音频文件上传到工具或阿里云平台。 - **调用API**:然后,工具会调用阿里云的录音文件识别API,将音频文件传送给服务器。 - **语音识别**:阿里云的服务器接收到音频后...

    阿里云前端视频上传 和后台接口的交互

    在阿里云前端视频上传与后台接口的交互过程中,开发者通常会使用阿里云提供的SDK和API来实现高效、安全的文件上传功能。以下是对这个主题的详细讲解。 首先,`jq`指的是jQuery,一个广泛使用的JavaScript库,简化了...

    阿里云存储简易文件上传系统php版v1.1根目录版

    阿里云存储简易文件上传系统1.1 更新 增加了底部显示客户的IP,提示勿上传非法文件 阿里云SDK更新至最新版本 根目录和子目录分开 下载URL使用三级域名 即 bucket.storage.aliyun.com/filename.zip 这种格式 阿里云...

    阿里云视频点播上传

    阿里云提供了一套JavaScript SDK,开发者可以将其集成到网页中,实现文件选择、进度显示、错误处理等功能。在JavaDemo中,这部分代码会展示如何利用SDK实现文件的分块上传,确保大文件上传的稳定性和效率。 3. **...

    阿里云OSS对象云存储上传控件仿百度webuploader插件

    阿里云OSS的上传控件是为了方便开发者在网页上实现文件上传功能而设计的,它可以无缝集成到各种Web应用中,提升用户体验,同时简化了开发流程。 “阿里云OSS对象云存储上传控件仿百度webuploader插件”是针对阿里云...

    vue阿里云oss文件的基本操作

    Vue.js与阿里云OSS(Object Storage Service)的集成是Web开发中常见的一环,尤其在需要处理静态资源上传、存储和管理的场景下。阿里云OSS是一种高可用、安全、低成本的云存储服务,而Vue.js则是一款轻量级的前端...

    阿里云视频上传web版本.zip

    9. **回调URL和元数据**: 开发者可以设置上传成功后的回调URL,阿里云会在文件上传完成后发送通知到这个URL,便于后续处理。同时,还可以添加自定义的元数据信息,如视频的作者、时间等。 10. **浏览器兼容性**: ...

    Java 生成pdf文件加盖公章图片,上传阿里云

    这里,我们探讨如何使用Java实现这一功能,并将生成的文件上传至阿里云存储服务。以下是一些关键知识点: 1. **Java PDF库**:生成PDF文件通常需要借助第三方库,如iText或Apache PDFBox。iText是一个流行的选择,...

    ueditor上传图片到阿里云oss服务器

    - 使用阿里云提供的SDK,如Node.js、Java、Python等,进行文件上传操作。 - 接口返回上传成功后的OSS图片URL,ueditor会自动处理这个URL并显示图片。 5. **ueditor设置** - 在ueditor中设置图片上传的相关参数,...

    前端Jquery,Vue通过授权URL直传阿里云OSS

    在前端开发中,有时我们需要将用户上传的文件直接存储到云端服务器,比如阿里云的对象存储服务(OSS)。本文将详细介绍如何使用Jquery和Vue.js这两个前端库,结合阿里云OSS提供的API,实现通过授权URL进行文件的直传...

    summernote集成前端oss上传图片到阿里云服务器

    - **编写JavaScript代码**:创建一个新的Summernote插件,负责处理上传事件,调用OSS SDK进行文件上传。 - **配置Summernote**:在初始化Summernote时,将新编写的插件添加到编辑器配置中,指定图片上传的处理函数...

    微信小程序上传图片到阿里云oss

    3. 使用阿里云OSS SDK进行图片上传的步骤,包括初始化客户端、构建上传路径和处理上传结果。 4. 图片URL的管理策略,通过年月日进行文件夹划分。 5. 小程序中显示图片的处理,通过OSS返回的URL直接在小程序中加载。 ...

    阿里云javascript点播上传

    阿里云视频点播服务是一种高效、灵活的在线视频管理解决方案,允许用户上传、存储、转码、分发和管理视频内容。在JavaScript端进行阿里云点播上传,开发者需要掌握一系列的技术点,包括但不限于以下几个核心方面: ...

Global site tag (gtag.js) - Google Analytics