RestTemplate上传图片

来源:互联网 发布:族谱制作软件 编辑:程序博客网 时间:2024/06/12 23:54

今天用RestTemplate上传图片,在这里分享下。

同事定义的接收类型为MultipartFile,这是spring的对文件上传的一个组件。
我现在做的是跟以前的系统对接,图片上传之后使用BASE64处理的,所以我这里是使用BASE64对数据解码,然后处理。先看代码:
Controller的主代码:

public Object upload(String image){//      FileSystemResource fileResource = new FileSystemResource(new File("d://image"));        BASE64Decoder decoder=new BASE64Decoder();//      byte[] rawBytes = utils.File2byte("d://test.png");//将图片转为byte[]        byte[] rawBytes=decoder.decodeBuffer(image);        String suffix=utils.getSuffix(rawBytes);//获取图片的后缀名,也可以是其他任意文件名        String fileName="myImage"+suffix;//        ByteArrayResource fileResource = new ByteArrayResource(rawBytes) {            @Override            public String getFilename() {                return fileName;            }        };        MultiValueMap<String,Object> postParameters=new LinkedMultiValueMap<String,Object>();        postParameters.add("file",fileResource);//        HttpHeaders headers = new HttpHeaders();//        headers.setContentType(MediaType.MULTIPART_FORM_DATA);//        HttpEntity<MultiValueMap<String, Object>> requestEntity  = new HttpEntity<MultiValueMap<String, Object>>(postParameters, headers);        RestTemplate restTemplate=new RestTemplate();        String url=localUri+"/image/upload";        BasicResponse basicResponse=restTemplate.postForObject(url,postParameters,BasicResponse.class);        return basicResponse;    }

用到的工具类utils :

package com.test;import java.io.*;import java.util.Arrays;/** * Created by pangkunkun on 2017/6/27. */public class utils {    public static String getSuffix(byte[] source){        byte[] byteSuffix= Arrays.copyOf(source,3);        String hexSuffix=bytesToHexString(byteSuffix);        switch (hexSuffix){            case "89504e":                return ".png";            case "ffd8ff":                return ".jpg";            default:                return ".jpg";        }    }    public static String bytesToHexString(byte[] src) {        StringBuilder stringBuilder = new StringBuilder();        if (src == null || src.length <= 0) {            return null;        }        for (int i = 0; i < src.length; i++) {            int v = src[i] & 0xFF;            String hv = Integer.toHexString(v);            if (hv.length() < 2) {                stringBuilder.append(0);            }            stringBuilder.append(hv);        }        return stringBuilder.toString().toLowerCase();    }    public static byte[] File2byte(String filePath)    {        byte[] buffer = null;        try        {            File file = new File(filePath);            FileInputStream fis = new FileInputStream(file);            ByteArrayOutputStream bos = new ByteArrayOutputStream();            byte[] b = new byte[1024];            int n;            while ((n = fis.read(b)) != -1)            {                bos.write(b, 0, n);            }            fis.close();            bos.close();            buffer = bos.toByteArray();        }        catch (FileNotFoundException e)        {            e.printStackTrace();        }        catch (IOException e)        {            e.printStackTrace();        }        return buffer;    }}

因为我们的项目默认只有png和jpg,所以上面获取图片格式(文件后缀名)的方法我只处理了两种格式的,如果有其它的需要,可以上网查下相关格式对应的后缀名添加上去。

特别说下,因为我是用本地图片测的,所以在网上找到两种方法:

      FileSystemResource fileResource = new FileSystemResource(new File("d://image"));

        byte[] rawBytes = utils.File2byte("d://test.png");//将图片转为byte[]     // byte[] rawBytes=decoder.decodeBuffer(image);        String suffix=utils.getSuffix(rawBytes);//获取图片的后缀名,也可以是其他任意文件名        String fileName="myImage"+suffix;//        ByteArrayResource fileResource = new ByteArrayResource(rawBytes) {            @Override            public String getFilename() {                return fileName;            }        };

第一种不多说了,很简单。
第二种比较复杂,但是比较符合我的需求,而且不需要把文件本地化。
但是这里有个地方需要注意下,使用ByteArrayResource 必须要实现getFilename。

但是上面的方法是针对MultipartFile,如果接收方使用的是File对象,传的时候直接使用一般的文件就行:

File file =new File("d://image");

将file直接作为一个参数传过去就OK。