spring boot 集成阿里云上传图片

1、properties文件阿里云配置
accesskeyid=xxxxxx
accesskeysecret=xxxxxxx
bucket=xxx
endpoint=oss-cn-beijing.aliyuncs.com
protocol=http
domain=dysmsapi.aliyuncs.com
product=Dysmsapi
starpoint = xxxx

2、pom文件加入相关的jar包
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.1</version>
</dependency>

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>   

3、建立阿里云的model包,在这个包里面建两个class, 一个来接受配置文件的阿里云的配置,一个来接受返回的值。

ALiYunOss来接受配置文件中的配置。
@Component
@Configuration
public class ALiYunOss {
    @Value("${bucket}")
    private String bucket;
    @Value("${accesskeyid}")
    private String accesskeyid;
    @Value("${accesskeysecret}")
    private String accesskeysecret;
    @Value("${endpoint}")
    private String endpoint;
    @Value("${protocol}")
    private String protocol;
    @Value("${domain}")
    private String customdomain;
    @Value("${starpoint}")
    private String starpoint;
    @Value("${product}")
    private String product;

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    /**
     * 协议
     * 
     * @return
     */
    
    public String getAccesskeyid() {
        return accesskeyid;
    }

    public void setAccesskeyid(String accesskeyid) {
        this.accesskeyid = accesskeyid;
    }

    public String getAccesskeysecret() {
        return accesskeysecret;
    }

    public void setAccesskeysecret(String accesskeysecret) {
        this.accesskeysecret = accesskeysecret;
    }
    
    public String getProtocol() {
        return protocol;
    }

    public String getBucket() {
        return bucket;
    }

    public void setBucket(String bucket) {
        this.bucket = bucket;
    }


    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public String getStarpoint() {
        return starpoint;
    }

    public void setStarpoint(String starpoint) {
        this.starpoint = starpoint;
    }

    /**
     * 协议
     * 
     * @return
     */
    public void setProtocol(String protocol) {
        this.protocol = protocol;
    }


    /**
     * 获取域名
     * 
     * @return
     */
    public String getDomain() {
        if (StringUtils.isEmpty(customdomain))
            return getEndpoint().replace(getProtocol() + "://", getProtocol() + "://" + getBucket() + ".");
        else
            return this.customdomain;

    }
    
    
    public String getCustomdomain() {
        return customdomain;
    }
    
    /**
     * 自定义域名,如果存在自定义域名,则直接使用自定义域名
     * 
     * @return
     */

    public void setCustomdomain(String customdomain) {
        this.customdomain = customdomain;
    }

    /**
     * 获取图片路径
     * 
     * @return
     */
    public String getPoint(){
        return (this.protocol+"://"+this.starpoint+"."+this.endpoint+"/");
    }
    

}

OSS返回数据
public class OSSResultModel {
    private String url = "";
    private String path = "";
    private String host = "";

    /**
     * 完整URL地址
     * 
     * @return
     */
    public String getUrl() {
        return url;
    }

    /**
     * 完整URL地址
     * 
     * @return
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * 相对路径
     * 
     * @return
     */
    public String getPath() {
        return path;
    }

    /**
     * 相对路径
     * 
     * @return
     */
    public void setPath(String path) {
        this.path = path;
    }

    /**
     * 主机地址
     * 
     * @return
     */
    public String getHost() {
        return host;
    }

    /**
     * 主机地址
     * 
     * @return
     */
    public void setHost(String host) {
        this.host = host;
    }

}

4、创建文件管理接口
@Component
public interface FileServiceInterFace {
/**
* 上传数据流
*
* @param inputStream
* @return
*/
OSSResultModel saveFile(String key, InputStream inputStream);

    /**
     * 上传文件
     * 
     * @param file
     * @return
     */
    OSSResultModel saveFile(String key, File file);

    /**
     * 上传Byte流
     * 
     * @param byteArrayInputStream
     * @return
     */
    OSSResultModel saveFile(String key, ByteArrayInputStream byteArrayInputStream);

    /**
     * 上传字符串
     * 
     * @param string
     * @return
     */
    OSSResultModel saveFile(String key, String string);

    /**
     * 上传网络流
     * 
     * @param url
     * @return
     */
    OSSResultModel saveFile(String key, URL url);
}

5、实现阿里云服务上传图片
@Service
public class ALIOSSFileService implements FileServiceInterFace {

    @Autowired
    private ALiYunOss aLiYunOss;

    

    @Override
    public OSSResultModel saveFile(String key, InputStream inputStream) {
        
        OSSResultModel ossResult = new OSSResultModel();
        OSSClient ossClient = new OSSClient(aLiYunOss.getEndpoint(), aLiYunOss.getAccesskeyid(),
                aLiYunOss.getAccesskeysecret());
        String ossKey = "f/" + key.hashCode() % 64 + "/" + key;
        ossClient.putObject(aLiYunOss.getBucket(), ossKey, inputStream);
        // 关闭client
        ossClient.shutdown();
        // http://abugong-uploadtest.oss-cn-shanghai.aliyuncs.com/a
        ossResult.setPath(ossKey);
        ossResult.setHost(aLiYunOss.getDomain());
        ossResult.setUrl(aLiYunOss.getPoint()+ ossResult.getPath());
        return ossResult;// aiYunOss.getEndpoint().replace("http://", "http://"
                            // + aiYunOss.getBucket() + ".") + "/" + ossKey;
    }

    @Override
    public OSSResultModel saveFile(String key, File file) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public OSSResultModel saveFile(String key, ByteArrayInputStream byteArrayInputStream) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public OSSResultModel saveFile(String key, String string) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public OSSResultModel saveFile(String key, URL url) {
        // TODO Auto-generated method stub
        return null;
    }

}

6、实现阿里云上传图片工具类
@Component
public class FileUtils {

    @Autowired
    FileServiceInterFace aLIOSSFileService;
    
    /**
     * 文件copy方法
     * @param src
     * @param dest
     */
    public  void copy(InputStream src, OutputStream dest) {
        try {
            byte[] tmp = new byte[1024];
            int len = -1;
            while ((len = src.read(tmp)) != -1)
                dest.write(tmp, 0, len);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    
    /**
     * 给文件重命名 防止覆盖
     * @param fileName
     * @return 时间戳+原始文件的后缀
     */
    public  String reName(String fileName){
        return new StringBuffer().append(new Date().getTime()).append(fileName.substring(fileName.indexOf("."))).toString();
    }
    
    /**
     * 文件保存
     * @param fileName reName之后的文件名称
     * @param content 
     * @param filePath 文件保存路径
     * @return 
     * @throws IOException
     */
    public OSSResultModel saveFile(String fileName, InputStream content) throws IOException {
        FileOutputStream fos = null;
        OSSResultModel ossResul = null;
         try {
            //上传到oss
             ossResul = aLIOSSFileService.saveFile(fileName, content);
            
        } catch (Exception e) {
            throw new IOException("文件保存失败!");
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (Exception e) {
                    throw new IOException("文件保存失败!");
                }
            }
        }
        
        return ossResul;
    }
}

7、使用阿里云(Service)
@Service
public class TestService {

    @Autowired
    private FileUtils fileUtils;

    /**
     * 图片上传阿里云
     * @param request
     * @param response
     * @return
     * @throws IOException
     */

    public Map<String,Object> upload(HttpServletRequest req){
        Map<String,Object> result = new HashMap<String, Object>();

        MultipartHttpServletRequest mReq  =  null;
        MultipartFile file = null;
        InputStream is = null ;
        OSSResultModel ossResult = null;
        String fileName = "";
        // 原始文件名   UEDITOR创建页面元素时的alt和title属性
        String originalFileName = "";

        try {
            mReq = (MultipartHttpServletRequest)req;
            // 从config.json中取得上传文件的ID
            file = mReq.getFile("file");
            // 取得文件的原
            fileName = file.getOriginalFilename();
            originalFileName = fileName;
            if(!StringUtils.isEmpty(fileName)){
                is = file.getInputStream();
                fileName = fileUtils.reName(fileName);
                ossResult = fileUtils.saveFile(fileName, is);
            } else {
                throw new IOException("文件名为空!");
            }

            String[] strings = new String[5];
            strings[0] = ossResult.getUrl();


            result.put("errno",0);
            result.put("data",strings);

            //result.put("state", "SUCCESS");// UEDITOR的规则:不为SUCCESS则显示state的内容
            //result.put("url",ossResult.getUrl());
            //result.put("title", fileName);
            //result.put("original", fileName);
        }
        catch (Exception e) {
            System.out.println(e.getMessage());
            result.put("state", "文件上传失败!");
            result.put("url","");
            result.put("title", "");
            result.put("original", "");
            System.out.println("文件 "+fileName+" 上传失败!");
        }

        return result;
    }


}

8、使用阿里云(Controller)
@Controller
public class TestController {

    @Autowired
    TestService testService;

     * 图片上传阿里云
     *
     * @param request
     * @param response
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "/upload")
    @ResponseBody
    public Map<String, Object> upload(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        return testService.upload(request);
    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容