一.注册阿里云账号,购买OSS服务
获取 : 连接区域地址endpoint ;需要存储的bucketName;图片保存路径picLocation ;连接keyId;accessKeyId ;连接秘钥accessKeySecret;
(一).在配置文件config.properties中配置阿里云文件:
#oss文件储存配置
#连接区域地址
endpoint=
#需要存储的bucketName
bucketName=
#图片保存路径
picLocation=
#连接keyId
accessKeyId=
#连接秘钥
accessKeySecret=
( 二 ).编写工具类
============================================================================
1.读取config.properties配置文件类
package com.tc.common.pic; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * 读取后缀名为“.properties”的文件 * @author */ public class SystemConfig { private static final String CONFIG_PROPERTIES = "conf/config.properties"; public static String getConfigResource(String key) throws IOException { ClassLoader loader = Thread.currentThread().getContextClassLoader(); Properties properties = new Properties(); InputStream in = loader.getResourceAsStream(CONFIG_PROPERTIES); properties.load(in); String value = properties.getProperty(key); // 编码转换,从ISO-8859-1转向指定编码 value = new String(value.getBytes("ISO-8859-1"), "UTF-8"); in.close(); return value; } }
============================================================================
2.获取config.properties配置文件中的配置数据 package com.tc.common.pic; /** * Project Name: * FileName: PageController * Author: zq * Date: 2018/5/2 * @since: 1.0.0 */ import java.io.IOException; /** * @ClassName: OSSConfig * @Description: OSS配置类 * @author AggerChen * 2016年11月4日 下午3:58:36 */ public class OSSConfig { private String endpoint; //连接区域地址 private String accessKeyId; //连接keyId private String accessKeySecret; //连接秘钥 private String bucketName; //需要存储的bucketName private String picLocation; //图片保存路径 public OSSConfig() { try { this.endpoint = SystemConfig.getConfigResource("endpoint"); this.bucketName = SystemConfig.getConfigResource("bucketName"); this.picLocation = SystemConfig.getConfigResource("picLocation"); this.accessKeyId = SystemConfig.getConfigResource("accessKeyId"); this.accessKeySecret = SystemConfig .getConfigResource("accessKeySecret"); } catch (IOException e) { e.printStackTrace(); } } public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } 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 getBucketName() { return bucketName; } public void setBucketName(String bucketName) { this.bucketName = bucketName; } public String getPicLocation() { return picLocation; } public void setPicLocation(String picLocation) { this.picLocation = picLocation; } }
============================================================================
3.获取OSS上传图片的核心工具类
package com.tc.common.pic; /** * FileName: PageController * Author: zq * Date: 2018/5/2 * @since: 1.0.0 */ import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.UUID; import com.aliyun.oss.ClientException; import com.aliyun.oss.OSSClient; import com.aliyun.oss.OSSException; import com.aliyun.oss.model.DeleteObjectsRequest; import com.aliyun.oss.model.DeleteObjectsResult; import com.aliyun.oss.model.GenericRequest; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import org.springframework.web.multipart.commons.CommonsMultipartFile; /** * * @ClassName: OSSUploadUtil * @Description: 阿里云OSS文件上传工具类 * @author AggerChen * 2016年11月3日 下午12:03:24 */ public class OSSUploadUtil { private static OSSConfig config = null; /** * @MethodName: uploadFile * @Description: OSS单文件上传 * @param file * @param fileType 文件后缀 * @return String 文件地址 */ public static String uploadFile(CommonsMultipartFile file, String fileType) { config = config == null ? new OSSConfig() : config; String fileName = config.getPicLocation() + UUID.randomUUID().toString() .toUpperCase().replace("-", "") + "." + fileType; //文件名,根据UUID来 return putObject(file, fileType, fileName); } /** * @MethodName: updateFile * @Description: 更新文件:只更新内容,不更新文件名和文件地址。 * (因为地址没变,可能存在浏览器原数据缓存,不能及时加载新数据,例如图片更新,请注意) * @param file * @param fileType * @param oldUrl * @return String */ public static String updateFile(CommonsMultipartFile file, String fileType, String oldUrl) { String fileName = getFileName(oldUrl); if (fileName == null) return null; return putObject(file, fileType, fileName); } /** * @MethodName: replaceFile * @Description: 替换文件:删除原文件并上传新文件,文件名和地址同时替换 * 解决原数据缓存问题,只要更新了地址,就能重新加载数据) * @param file * @param fileType 文件后缀 * @param oldUrl 需要删除的文件地址 * @return String 文件地址 */ public static String replaceFile(CommonsMultipartFile file, String fileType, String oldUrl) { boolean flag = deleteFile(oldUrl); //先删除原文件 if (!flag) { //更改文件的过期时间,让他到期自动删除。 } return uploadFile(file, fileType); } /** * * @MethodName: deleteFile * @Description: 单文件删除 * @param fileUrl 需要删除的文件url * @return boolean 是否删除成功 */ public static boolean deleteFile(String fileUrl) { config = config == null ? new OSSConfig() : config; String bucketName = OSSUploadUtil .getBucketName(fileUrl); //根据url获取bucketName String fileName = OSSUploadUtil .getFileName(fileUrl); //根据url获取fileName if (bucketName == null || fileName == null) return false; OSSClient ossClient = null; try { ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); GenericRequest request = new DeleteObjectsRequest(bucketName) .withKey(fileName); ossClient.deleteObject(request); } catch (Exception oe) { oe.printStackTrace(); return false; } finally { ossClient.shutdown(); } return true; } /** * @MethodName: batchDeleteFiles * @Description: 批量文件删除(较快):适用于相同endPoint和BucketName * @param fileUrls 需要删除的文件url集合 * @return int 成功删除的个数 */ public static int deleteFile(List<String> fileUrls) { int deleteCount = 0; //成功删除的个数 String bucketName = OSSUploadUtil .getBucketName(fileUrls.get(0)); //根据url获取bucketName List<String> fileNames = OSSUploadUtil .getFileName(fileUrls); //根据url获取fileName if (bucketName == null || fileNames.size() <= 0) return 0; OSSClient ossClient = null; try { ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName) .withKeys(fileNames); DeleteObjectsResult result = ossClient.deleteObjects(request); deleteCount = result.getDeletedObjects().size(); } catch (OSSException oe) { oe.printStackTrace(); throw new RuntimeException("OSS服务异常:", oe); } catch (ClientException ce) { ce.printStackTrace(); throw new RuntimeException("OSS客户端异常:", ce); } finally { ossClient.shutdown(); } return deleteCount; } /** * @MethodName: batchDeleteFiles * @Description: 批量文件删除(较慢):适用于不同endPoint和BucketName * @param fileUrls 需要删除的文件url集合 * @return int 成功删除的个数 */ public static int deleteFiles(List<String> fileUrls) { int count = 0; for (String url : fileUrls) { if (deleteFile(url)) { count++; } } return count; } /** * * @MethodName: putObject * @Description: 上传文件 * @param file * @param fileType * @param fileName * @return String */ private static String putObject(CommonsMultipartFile file, String fileType, String fileName) { config = config == null ? new OSSConfig() : config; String url = null; //默认null OSSClient ossClient = null; try { ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret()); InputStream input = file.getInputStream(); ObjectMetadata meta = new ObjectMetadata(); // 创建上传Object的Metadata meta.setContentType( OSSUploadUtil.contentType(fileType)); // 设置上传内容类型 meta.setCacheControl("no-cache"); // 被下载时网页的缓存行为 PutObjectRequest request = new PutObjectRequest( config.getBucketName(), fileName, input, meta); //创建上传请求 ossClient.putObject(request); url = config.getEndpoint().replaceFirst("http://", "http://" + config.getBucketName() + ".") + "/" + fileName; //上传成功再返回的文件路径 } catch (OSSException oe) { oe.printStackTrace(); return null; } catch (ClientException ce) { ce.printStackTrace(); return null; } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); } finally { ossClient.shutdown(); } return url; } /** * @MethodName: contentType * @Description: 获取文件类型 * @param fileType * @return String */ private static String contentType(String fileType) { fileType = fileType.toLowerCase(); String contentType = ""; if (fileType.equals("bmp")) { contentType = "image/bmp"; } else if (fileType.equals("gif")) { contentType = "image/gif"; } else if (fileType.equals("png") || fileType.equals("jpeg") || fileType .equals("jpg")) { contentType = "image/jpeg"; } else if (fileType.equals("html")) { contentType = "text/html"; } else if (fileType.equals("txt")) { contentType = "text/plain"; } else if (fileType.equals("vsd")) { contentType = "application/vnd.visio"; } else if (fileType.equals("ppt") || fileType.equals("pptx")) { contentType = "application/vnd.ms-powerpoint"; } else if (fileType.equals("doc") || fileType.equals("docx")) { contentType = "application/msword"; } else if (fileType.equals("xml")) { contentType = "text/xml"; } else if (fileType.equals("mp4")) { contentType = "video/mp4"; } else { contentType = "application/octet-stream"; } return contentType; } /** * * @MethodName: getBucketName * @Description: 根据url获取bucketName * @param fileUrl 文件url * @return String bucketName */ private static String getBucketName(String fileUrl) { String http = "http://"; String https = "https://"; int httpIndex = fileUrl.indexOf(http); int httpsIndex = fileUrl.indexOf(https); int startIndex = 0; if (httpIndex == -1) { if (httpsIndex == -1) { return null; } else { startIndex = httpsIndex + https.length(); } } else { startIndex = httpIndex + http.length(); } int endIndex = fileUrl.indexOf(".oss-"); return fileUrl.substring(startIndex, endIndex); } /** * @MethodName: getFileName * @Description: 根据url获取fileName * @param fileUrl 文件url * @return String fileName */ private static String getFileName(String fileUrl) { String str = "aliyuncs.com/"; int beginIndex = fileUrl.indexOf(str); if (beginIndex == -1) return null; return fileUrl.substring(beginIndex + str.length()); } /** * * @MethodName: getFileName * @Description: 根据url获取fileNames集合 * @param fileUrls 文件url * @return List<String> fileName集合 */ private static List<String> getFileName(List<String> fileUrls) { List<String> names = new ArrayList<String>(); for (String url : fileUrls) { names.add(getFileName(url)); } return names; } }
============================================================================
4.后台controller中调用工具类实现图片上传
package com.tc.lvmsm.controller.gm; import com.tc.common.bean.cm.CmService; import com.tc.common.log.BaseController; import com.tc.common.log.ModuleLogger; import com.tc.common.log.ModuleLoggerFactory; import com.tc.common.page.Page; import com.tc.common.pic.OSSUploadUtil; import com.tc.lvmsm.serv.itf.GasCylinderCheckInfoService; import com.tc.lvmsm.serv.itf.GasService; import com.tc.lvmsm.vo.cm.VehicleAndGasCylinderAndGasCylinderCheckInfo; import com.tc.lvmsm.vo.gm.*; import com.tc.lvmsm.vo.vm.Vehicle; import com.tc.lvmsm.vo.vm.VehicleExample; import com.tc.util.DateUtils; import com.tc.util.ExcelUtil; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.*; /** * FileName: GasCylinderCheckInfoController * Author: 苏凯 * Date: 2018/3/22 19:08 * @version 1.0.0 * @since: 1.0.0 */ @Controller public class GasCylinderCheckInfoController { /** * 配置管理、Service层各模块接口bean */ @Autowired private CmService cmServiceFactory; /** * 气瓶管理、气瓶定检service */ @Autowired private GasCylinderCheckInfoService gasCylinderCheckInfoService; /** * 配置管理 气瓶service */ @Autowired private GasService gasService; /** * 获得日志句柄 */ private ModuleLogger logger = ModuleLoggerFactory .getDefinedLogger("GM\\GasCylinderCheckInfoController "); /* * ========================上传oss============================================ */ /** * 文件上传 */ @RequestMapping(value = "/config/create-AllGasCylinderCheckInfoFileurlFileUpload", method = RequestMethod.POST) @ResponseBody public Page AllGasCylinderCheckInfoProductqualifyurlFileUpload( @RequestParam("file") List<CommonsMultipartFile> files, HttpServletRequest request) throws IOException { String CALLER = "GasCylinderCheckInfoController_/config/create-AllGasCylinderCheckInfoFileurlFileUpload "; String startTime = DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss"); String fileName = ""; String fileType = ""; Page page = new Page(); String urls = ""; try { if (null != files && 0 < files.size()) { for (int i = 0; i < files.size(); i++) { if (!files.get(i).isEmpty()) { // 文件保存路径 CommonsMultipartFile file = (CommonsMultipartFile) files .get(i); fileName = file.getOriginalFilename(); if (null != fileName && 0 < fileName.length()) { fileType = fileName .substring(fileName.lastIndexOf(".") + 1); } //图片上传调用阿里OSS工具OSSUploadUtil接口 String url = OSSUploadUtil.uploadFile(file, fileType); if (null != url && 0 < url.length()) { urls += url + ","; } else { page.setFailDesc("图片上传不成功!"); page.setResultCode(505); } } } if (null != urls && 0 < urls.length()) { page.setFieldString(urls); page.setFailDesc("图片上传成功!"); page.setResultCode(200); } } else { page.setFailDesc("未获取到文件信息!"); page.setResultCode(505); } } catch (Exception e) { e.printStackTrace(); BaseController.saveLog( SecurityUtils.getSubject().getPrincipals().toString(), startTime, DateUtils.getCurrentDate("yyyy-MM-dd HH:mm:ss"), BaseController.getRequestIp(request), "气瓶信息", "气瓶定检信息", "增加气瓶定检信息/文件上传", 0, 1, "系统异常文件上传失败!" + CALLER) } finally { return page; } } }