照片、文件的上传、下载已经很普及了,前两天接到过一个需求,让我开发一个接口,逻辑大概就是将我的本地服务器上的图片主动发送给另外一家的服务接口,开始想了有两种方案,第一种就是回传照片原始文件,第二种就是将照片转为base64后发送,第三种就是给文件服务器做映射,将图片文件的url回传给对方。
刚开始选用的是第二种办法,直接原始照片加密后发送,但是就会出现一个问题,一旦图片大小过大,加密后的密文就会非常长,长达几百万,并且还会出现照片解析后失真,缺失等现象,问题代码如下:
package Test; import sun.misc.BASE64Encoder; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class Image { public static void main(String[] args) { // String path = "D:\test\IMG1.jpg";"" String path = "D:\test\222\1.jpg"; String imageStr = getBase64(path); System.out.println("Image:"+imageStr.toString()); } /** * 照片绝对路径 * @param filePath * @return */ public static String getBase64(String filePath){ String imgStr = ""; try { File file = new File(filePath); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; int offset = 0; int numRead = 0; while (offset < buffer.length && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) { offset += numRead; } if (offset != buffer.length) { throw new IOException("Could not completely read file " + file.getName()); } fis.close(); BASE64Encoder encoder = new BASE64Encoder(); imgStr = encoder.encode(buffer); } catch (Exception e) { e.printStackTrace(); } return "data:image/jpeg;base64,"+imgStr; } }
这时候就以为是base加密的方法不对,就在网上找各种base64加密方法,最后发现都会出现一样的问题,难搞哟~
这时候就怀疑是不是图片太大导致的呢?用同样的加密方法压缩不同大小图片果然有问题,图片太大密文就太长,容易使得照片解析后出问题,然后就打算另辟蹊径去解决这个问题,想着你图片不是怕大么,那我就把图给你压缩小点不就行了么,嘿嘿我真是个小机灵鬼~skr~
package Test; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class ImageCompressUtil { // private static Logger logger = Logger.getLogger(ImageCompressUtil.class); public static File compressImage(File file, int ratio) throws Exception { FileOutputStream out = null; // 构造Image对象 // System.out.println("图片压缩Start..."); System.out.println("图片压缩Start..."); BufferedImage src = javax.imageio.ImageIO.read(file); int width = src.getWidth(); int height = src.getHeight(); // 缩小边长 BufferedImage tag = new BufferedImage(width / ratio, height / ratio, BufferedImage.TYPE_INT_RGB); // 绘制 缩小 后的图片 tag.getGraphics().drawImage(src, 0, 0, width / ratio, height / ratio, null); String tempFilePath = file.getPath();//压缩后的文件路径 File tempFile=new File(tempFilePath); out = new FileOutputStream(tempFile); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); out.close(); System.out.println(file.getAbsolutePath() + "图片压缩成功"); return tempFile; } public static void main(String... args) { File file = new File("D:\test\IMG2.jpg"); System.out.println(file.length()); try { System.out.println("压缩图片"); file=compressImage(file, 2); System.out.println(file.length()); // file.delete();//将压缩后的文件删除 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
然后试了试还行,压缩的时候得根据图片大小来,要不然压缩的图片有问题。
只不过现在是没有考虑到效率的问题,先把逻辑跑通先~
然后正当哥们逻辑跑通,想优化的时候,联调群里对方突然说:“奥,那个照片回传你们给我url就好。”
顿时我佛了啊、、、、恩,淡定淡定,该需求不是常有的事么,对吧,虽然这次改动xue微大了点 /手动狗头