构建基于阿里云OSS的第三方文件上传RESTful接口

来源:互联网 发布:随机信号分析 知乎 编辑:程序博客网 时间:2024/05/29 18:37

转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50719771

  • 《构建基于阿里云OSS文件上传服务》
  • 《构建基于OSS的第三方文件上传RESTful接口》

1.0 前言

随着自身业务的不断发展,慢慢开始关注OSS这种文件存储服务,当前我们利用OSS服务的主要目的就是存储WEB平台上用户上传的各种附件。

我的第一篇关于OSS服务的文章《构建基于阿里云OSS文件上传服务》主要讲了利用Java如何实现这种服务。虽说这种服务可以很方便的集成进WEB工程,但有时候我们想把这种文件上传服务做成通用的接口服务,以后不论是WEB工程,还是移动终端都可以调用这个接口来实现文件上传。

2.0 实现方式

基于SpringBoot实现RESTful接口服务。OSS文件上传接口主要包含两个部分:1、Http请求处理;2、OSS文件上传。

《构建基于阿里云OSS文件上传服务》文章中讲了“OSS文件上传”这部分,本篇文章主要讲前半部分“Http请求处理”。

3.0 Http请求处理

主要处理了以下两种方式的http请求:1、传统的File body提交的请求;2、Mutilpart body提交的请求。

在SpringBoot中我们利用Controller类来处理各种请求,如下面这种简单的HelloWorld请求:

package com.autonavi.controller;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;/** * <p>Author: loongshawn * <p>Date: 15-09-22 * <p>Version: 1.0 */@SuppressWarnings("unused")@EnableAutoConfiguration@RestController@RequestMapping("/hello")public class HelloController {    private static final Logger logger = LoggerFactory.getLogger(HelloController.class);    @RequestMapping(method=RequestMethod.GET)    private String view() {        logger.info("HelloController.method [request result]:" + "Hello World!");           return "Hello World! <br>Version:v002-2015-11-12-pm <br>Release:2015/11/12 15:47 <br>Environment:Development Environment";    }}

这是一个get方法。在浏览器中输入http://localhost:7001/hello将会返回下述结果:

图1.请求方法
这里写图片描述

图2.返回结果
这里写图片描述

接下来,我们进入具体OSS请求处理分析。

3.1 传统的File body提交的请求

以下为代码片段,只摘录相关的片段。

@ResponseBody@RequestMapping(value = "/attachment/auth/{fileExtensionName}",method=RequestMethod.POST,consumes=MediaType.ALL_VALUE)    private Response view(HttpServletRequest request ,@PathVariable String fileExtensionName){        // 初始化Response          Response rsp = new Response();         String fileName = "";                       try{            // 2016-02-19 文件上传升级OSS方式            fileName = FileUpload.fileUploadByOss(request, jsonObj);            if(!fileName.equals("0001")){                                   // 封装返回结果                JSONArray jsonArray = new JSONArray();                JSONObject jsonObj_file = new JSONObject();                jsonObj_file.put("fileName", fileName);                jsonArray.add(jsonObj_file);

上面请求hold方法中利用了fileUploadByOss()方法,改方法主要是获取HttpServletRequest的InputStream,然后利用经过封装的OSS上传方法上传。

// HttpServletRequest请求文件上传处理,融合OSS    public static String fileUploadByOss(HttpServletRequest request,JSONObject jsonObj){        String return_url = null;               String fileExtensionName = "";        String currentTime = "";        String type = "";        try{            if(jsonObj.containsKey("type")){                type = jsonObj.getString("type");            }            if(jsonObj.containsKey("fileExtensionName")){                fileExtensionName = jsonObj.getString("fileExtensionName");            }            if (!fileExtensionName.isEmpty()) {                  currentTime = Date2Str.getDate(0,3);                String fileName = currentTime +"."+fileExtensionName;                InputStream in = request.getInputStream();                String return_key = OSSUpload.put2(in,fileName);                in.close();                if(return_key == null || return_key.length() <= 0){                                  return "0001";                }                return_url = Constant.ossUrl + return_key;                           logger.info("FileUpload.fileUpload.HttpServletRequest [Success]: type-" + type +"url-"+return_url);                                           }        }catch (IOException e) {            // TODO Auto-generated catch block                          logger.info("FileUpload.fileUpload [Exceptions]:" + e);             return "0001";        }               return return_url;                   }

封装过的OSS文件上传方法:

public static String put2(InputStream in, String filename){        String return_key = null;        try {                                   OSSClient client = DefaultOSSClient.getDefaultOSSClient();            if(in != null){                String fileName = filename;                /**                try {                    fileName = new String(filename.getBytes("ISO-8859-1"),"UTF-8");                } catch (UnsupportedEncodingException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                **/                /**                * getCurrentTimeStamp()方法为同步方法,确保时间戳的唯一性。                */                String timeStamp = Date2Str.getCurrentTimeStamp();                String timeDate = Date2Str.getCurrentDate5();                String key = Constant.bashFilePath + timeDate + timeStamp +"/"+fileName;                client.putObject(new PutObjectRequest(Constant.bucketName, key, in));                return_key = key;            }            DefaultOSSClient.shutdownOSSClient();        } catch (ClientException e) {            // TODO Auto-generated catch block            // e.printStackTrace();            logger.info("OSSUpload.put2 error:" + e.toString());                return null;        }         return return_key;    }           

上传结果:请求成功,放回文件地址。

这里写图片描述

OSS管理平台显示结果:

这里写图片描述

3.2 Mutilpart body提交的请求

请求参数:MultipartFile

@ResponseBody@RequestMapping(value = "/attachment/auth/{fileExtensionName}",method=RequestMethod.POST)    private Response view(@RequestParam MultipartFile file,@PathVariable String fileExtensionName){        // 初始化Response          Response rsp = new Response();         String fileName = "";        try{            // 进入调度中心            fileName = FileUpload.fileUploadByOss(file, jsonObj);            if(!fileName.equals("0001")){            // 封装返回结果            JSONArray jsonArray = new JSONArray();            JSONObject jsonObj_file = new JSONObject();            jsonObj_file.put("fileName", fileName);            jsonArray.add(jsonObj_file);

处理Http hold中的MultipartFile文件:

// MultipartFile请求文件上传处理,融合OSS    public static String fileUploadByOss(MultipartFile file,JSONObject jsonObj){        String return_url = null;           String fileExtensionName = "";        if(jsonObj.containsKey("fileExtensionName") && !file.isEmpty()){            fileExtensionName = jsonObj.getString("fileExtensionName");                                               return_url = fileUpload(file,fileExtensionName);                         logger.info("FileUpload.fileUpload.MultipartFile [Success]: url-"+return_url);                                      }        return return_url;          }

获取MultipartFile文件的InputStream,仍然利用方式1中的封装过的OSS文件上传方法。

// OSS MultipartFile请求文件上传处理    public static String fileUpload(MultipartFile mfile,String fileExtensionName){        String return_url = null;               if(mfile != null){            InputStream in;            try {                String fileName = Date2Str.getDate(0,3) +"."+fileExtensionName;                // logger.info("FileUpload.fileUpload [fileName]:" + fileName);                 in = mfile.getInputStream();                String return_key = OSSUpload.put2(in,fileName);                return_url = Constant.ossUrl + return_key;                  in.close();            } catch (IOException e) {                // TODO Auto-generated catch block                              logger.info("FileUpload.fileUpload [Exceptions]:" + e);                 return "0001";            }               }        return return_url;                  }

上传结果:请求成功,放回文件地址。

这里写图片描述

OSS管理平台显示结果:

这里写图片描述

4.0 后记

还有许多不足之处会在接下来实践中不断改进。

0 0
原创粉丝点击