须要的jar包css
配置文件html
#=============================# #==== 阿里云 Oss 文件上传设置 ====# #=============================# #阿里云EndPoint# oss.endpoint= #阿里云BucketName# oss.bucketName= #阿里云 文件(图片、文档)上传路径前缀 不设置默认为空# oss.fileDir= #阿里云AccessKeyId# oss.accessKeyId= #阿里云AccessKeySecret# oss.accessKeySecret=
OSS工具类前端
package com.ctrl.aliyunOSS.Util; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Date; import com.aliyun.oss.model.*; import com.thinkgem.jeesite.common.utils.IdGen; import com.thinkgem.jeesite.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import com.aliyun.oss.OSSClient; import org.springframework.web.multipart.MultipartFile; /** * 使用阿里云OSS存储对象上传图片 * @author MrXiao * @version 1.0.0 */ @Configuration @PropertySource("classpath:jeesite.properties") public class OSSClientUtil { /** 日志 */ private static Logger logger = LoggerFactory.getLogger(OSSClientUtil.class); /** 阿里云API的内或外网域名 */ private static String endpoint; /** 阿里云API的bucket名称 */ private static String bucketName; /** 阿里云API的文件夹名称 */ private static String folder; /** 阿里云API的密钥Access Key ID */ private static String accessKeyId; /** 阿里云API的密钥Access Key Secret */ private static String accessKeySecret; public OSSClientUtil(){ } public OSSClientUtil(String endpoint,String bucketName, String folder,String accessKeyId,String accessKeySecret){ this.endpoint =endpoint; this.bucketName=bucketName; this.folder=folder; this.accessKeyId=accessKeyId; this.accessKeySecret=accessKeySecret; } /** * 获取阿里云OSS客户端对象 * * @return ossClient */ public static OSSClient getOSSClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 建立存储空间 * * @param ossClient OSS链接 * @param bucketName 存储空间 * @return */ public static String createBucketName(OSSClient ossClient, String bucketName) { // 存储空间 final String bucketNames = bucketName; if (!ossClient.doesBucketExist(bucketName)) { // 建立存储空间 Bucket bucket = ossClient.createBucket(bucketName); logger.info("建立存储空间成功"); return bucket.getName(); } return bucketNames; } /** * 删除存储空间buckName * * @param ossClient oss对象 * @param bucketName 存储空间 */ public static void deleteBucket(OSSClient ossClient, String bucketName) { ossClient.deleteBucket(bucketName); logger.info("删除" + bucketName + "Bucket成功"); } /** * 建立模拟文件夹 * * @param ossClient oss链接 * @param bucketName 存储空间 * @param folder 模拟文件夹名如"qj_nanjing/" * @return 文件夹名 */ public static String createFolder(OSSClient ossClient, String bucketName, String folder) { // 文件夹名 final String keySuffixWithSlash = folder; // 判断文件夹是否存在,不存在则建立 if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { // 建立文件夹 ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); logger.info("建立文件夹成功"); // 获得文件夹名 OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); String fileDir = object.getKey(); return fileDir; } return keySuffixWithSlash; } /** * 根据key删除OSS服务器上的文件 * * @param ossClient oss链接 * @param bucketName 存储空间 * @param folder 模拟文件夹名 如"qj_nanjing/" * @param key Bucket下的文件的路径名+文件名 如:"upload/cake.jpg" */ public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key) { ossClient.deleteObject(bucketName, folder + key); logger.info("删除" + bucketName + "下的文件" + folder + key + "成功"); } /** * 多图片上传 * 前端自己能够接受到MultipartFile的值 */ // public String getURL(HttpServletRequest request){ // String url = null; // MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request; // Iterator<String> ite = mr.getFileNames(); // while (ite.hasNext()) { // String name = ite.next(); // List<MultipartFile> file = mr.getFiles(name); // if (file != null || file.size() != 0) { // for (MultipartFile files : file) { // url = getMultipartFile(files); // } // } // } // return url; // } /** * 获取url路径 * */ public String getMultipartFile(MultipartFile file){ String url = null; try { // CommonsMultipartFile cf = (CommonsMultipartFile) file; // DiskFileItem fi = (DiskFileItem) cf.getFileItem(); InputStream fileContent = file.getInputStream(); //最好经过file.getOriginalFilename() MultipartFile对象获取 String fileName = file.getOriginalFilename(); OSSClient ossClient = OSSClientUtil.getOSSClient(); url = OSSClientUtil.uploadFile(fileContent,ossClient,fileName,bucketName); } catch (Exception e) { e.printStackTrace(); } return url; } /** * 上传图片至OSS * * @param ossClient oss链接 * @param bucketName 存储空间 * @param fileName * @return String 返回的惟一MD5数字签名 */ public static String uploadFile(InputStream fileContent,OSSClient ossClient,String fileName,String bucketName) throws Exception { //随机名处理 String resultStr = null; String url =null; fileName = IdGen.uuid()+ fileName.substring(fileName.lastIndexOf(".")); String path = getContentType(fileName.substring(fileName.lastIndexOf("."))); // 建立上传Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(fileContent.available()); objectMetadata.setContentEncoding("utf-8"); objectMetadata.setCacheControl("no-cache"); objectMetadata.setHeader("Pragma", "no-cache"); objectMetadata.setContentType(path); objectMetadata.setContentDisposition("inline;filename=" + fileName); // 上传文件 PutObjectResult putResult =ossClient.putObject(bucketName, folder+path +"/"+ fileName, fileContent, objectMetadata); resultStr = putResult.getETag(); // 设置URL过时时间为1小时。 Date expiration = new Date(System.currentTimeMillis()+3600*1000); // 生成以GET方法访问的签名URL,访客能够直接经过浏览器访问相关内容。 url = ossClient.generatePresignedUrl(bucketName,folder+path +"/" + fileName, expiration).toString(); url = StringUtils.substringBefore(url,"?"); // 关闭OSSClient ossClient.shutdown(); // 关闭io流 fileContent.close(); return url; } /** * 经过文件名判断并获取OSS服务文件上传时文件的contentType * * @param fileName 文件名 * @return 文件的contentType */ public static final String getContentType(String fileName) { String FilenameExtension = fileName.substring(fileName.lastIndexOf(".")); if (FilenameExtension.equalsIgnoreCase(".bmp")) { return "application/x-bmp"; } if (FilenameExtension.equalsIgnoreCase(".gif")) { return "image/gif"; } if (FilenameExtension.equalsIgnoreCase(".jpeg") || FilenameExtension.equalsIgnoreCase(".jpg") || FilenameExtension.equalsIgnoreCase(".png")) { return "image/jpeg"; } if (FilenameExtension.equalsIgnoreCase(".html")) { return "text/html"; } if (FilenameExtension.equalsIgnoreCase(".txt")) { return "text/plain"; } if (FilenameExtension.equalsIgnoreCase(".vsd")) { return "application/vnd.visio"; } if (FilenameExtension.equalsIgnoreCase(".pptx") || FilenameExtension.equalsIgnoreCase(".ppt")) { return "application/vnd.ms-powerpoint"; } if (FilenameExtension.equalsIgnoreCase(".docx") || FilenameExtension.equalsIgnoreCase(".doc")) { return "application/msword"; } if (FilenameExtension.equalsIgnoreCase(".xla") || FilenameExtension.equalsIgnoreCase(".xlc")|| FilenameExtension.equalsIgnoreCase(".xlm")|| FilenameExtension.equalsIgnoreCase(".xls")|| FilenameExtension.equalsIgnoreCase(".xlt")|| FilenameExtension.equalsIgnoreCase(".xlw")) { return "application/vnd.ms-excel"; } if (FilenameExtension.equalsIgnoreCase(".xml")) { return "text/xml"; } if (FilenameExtension.equalsIgnoreCase(".pdf")) { return "application/pdf"; } if (FilenameExtension.equalsIgnoreCase(".zip")) { return "application/zip"; } if (FilenameExtension.equalsIgnoreCase(".tar")) { return "application/x-tar"; } if (FilenameExtension.equalsIgnoreCase(".avi")) { return "video/avi"; } if (FilenameExtension.equalsIgnoreCase(".mp4")) { return "video/mpeg4"; } if (FilenameExtension.equalsIgnoreCase(".mp3")) { return "audio/mp3"; } if (FilenameExtension.equalsIgnoreCase(".mp2")) { return "audio/mp2"; } return "application/octet-stream"; } @Value("${endpoint}") public void setEndpoint(String endpoint) { OSSClientUtil.endpoint = endpoint; } @Value("${bucketName}") public void setBucketName(String bucketName) { OSSClientUtil.bucketName = bucketName; } @Value("${filePath}") public void setFolder(String folder) { OSSClientUtil.folder = folder; } @Value("${accessKeyId}") public void setAccessKeyId(String accessKeyId) { OSSClientUtil.accessKeyId = accessKeyId; } @Value("${accessKeySecret}") public void setAccessKeySecret(String accessKeySecret) { OSSClientUtil.accessKeySecret = accessKeySecret; } public static String getEndpoint() { return endpoint; } public static String getBucketName() { return bucketName; } public static String getFolder() { return folder; } public static String getAccessKeyId() { return accessKeyId; } public static String getAccessKeySecret() { return accessKeySecret; } }
Controller测试类java
package com.ctrl.aliyunOSS.web; import com.ctrl.aliyunOSS.Util.OSSClientUtil; import com.ctrl.mobile.respUtils.AppMessage; import com.thinkgem.jeesite.common.mapper.JsonMapper; import com.thinkgem.jeesite.common.web.BaseController; import org.springframework.beans.factory.annotation.Value; 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.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.LinkedHashMap; import java.util.Map; @Controller @RequestMapping(value = "${frontPath}/OSSClient",method = RequestMethod.POST) public class OSSClientUtilController extends BaseController { @Value("${oss.endpoint}") private String endpoint; @Value("${oss.bucketName}") private String bucketNames; @Value("${oss.fileDir}") private String filePath; @Value("${oss.accessKeyId}") private String accessKeyId; @Value("${oss.accessKeySecret}") private String accessKeySecret; /** * @Author liPeiMin * @Description OSS上传图片 * @Date 2019/8/12 * @Param [file,bucketName,folder] * @return java.lang.String * **/ @RequestMapping(value = "getFile",method = RequestMethod.POST) public String saveOpinion(@RequestParam("img")MultipartFile img, HttpServletResponse response) { OSSClientUtil ossClientUtil = new OSSClientUtil(endpoint,bucketNames,filePath,accessKeyId,accessKeySecret); String url = ossClientUtil.getMultipartFile(img); Map<String,Object> map = new LinkedHashMap<String, Object>(); map.put(AppMessage.MESSAGE,url); return renderString(response, JsonMapper.toJsonString(map), "application/json"); } //删除 //OSSClientUtil ossClientUtil = new //OSSClientUtil(endpoint,bucketNames,filePath,accessKeyId,accessKeySecret); // OSSClient ossClient = OSSClientUtil.getOSSClient(); // String url = ctrlFile.getFileUrl(); // String path = url.substring(url.lastIndexOf(filePath)); // ossClientUtil.deleteFile(ossClient,bucketNames,path); // addMessage(redirectAttributes, "删除文件成功"); }
传值部分jsjquery
// 实例化 uploader = WebUploader.create({ pick: { id: '#filePicker', label: '点击选择文件' }, dnd: '#uploader .queueList', paste: document.body, // accept: { // title: 'Images', // extensions: 'gif,jpg,jpeg,bmp,png', // mimeTypes: 'image/gif,image/jpg,image/jpeg,image/bmp,image/png,' // }, // swf文件路径 swf: 'js/plugins/webuploader/Uploader.swf', disableGlobalDnd: true, //分页上传 chunked: true, //服务器地址 server: 'http://localhost:8080/aiyi_platform/f/OSSClient/getFile', //参数名 fileVal:'img', //目前用img fileNumLimit: 300, fileSizeLimit: 200 * 1024 * 1024, // 200 M fileSingleSizeLimit: 50 * 1024 * 1024 // 50 M }); //成功回调函数 var imgArr=[]; //上传成功回调函数 uploader.on( 'uploadSuccess', function(files,response) { var json=JSON.parse(response._raw); // 使用JSON.parse()进行解析:使用JSON对象的静态方法parse(),将字符串解析为对象。 imgArr.push(json.respMsg); var img = $('<li ><img src="'+imgArr[imgArr.length-1]+'" style="height: 150px;width: 240px"><span id="exit">X</span></li>'); $("#imgs").append(img ); $("#url").val(imgArr) }); //获取url回显 var url = $("#url").val(); if(url!=null && url!=""){ var urls = url.split(","); for (var i = 0; i < urls.length; i++) { var href = urls[i]; var img = $('<li><img src="'+href+'" style="height: 150px;width: 240px"><span id="exit">X</span></li>'); imgArr.push(urls[i]); $("#imgs").append(img ); } } //删除 同时删除数组中的路径 $('#imgs').on('click',' li span',function(){ var imgArra=$(this).prev().attr('src') for(var i=0;i<imgArr.length;i++){ if(imgArra==imgArr[i]){ imgArr.splice(i,1) } } $("#url").val(imgArr); $(this).parent().remove(); })
jsp页面部分代码web
<%@ page contentType="text/html;charset=UTF-8" %> <script src="${ctxStatic}/jquery-fileUpload/js/webuploader.js"></script> <script src="${ctxStatic}/jquery-fileUpload/js/jquery.sortable.js"></script> <script src="${ctxStatic}/jquery-fileUpload/js/upload.js"></script> <link rel="stylesheet" type="text/css" href="${ctxStatic}/jquery-fileUpload/css/webuploader.css" /> <link rel="stylesheet" type="text/css" href="${ctxStatic}/jquery-fileUpload/css/style.css" /> <style> #imgs{ width: 980px; height: 192px; overflow:auto; margin-top: 10px; } #imgs li{ display: inline-block; position: relative; height: 150px; width: 240px; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; } #imgs li:hover #exit{ display: block; } #lefts li{ /*float: left;*/ display: inline-block; } .item_container{ overflow:auto; } #exit{ font-size: 16px; text-align: center; display: block; width: 22px; line-height: 22px; border-radius: 50%; background-color: red; color: #ffffff; position: absolute; top: 5px; right: 5px; display: none; -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none; } #exit:hover{ cursor: pointer; } #exit:active{ background-color: #ff570a; color: #555555; } </style> <ul id="lefts"> <li> <div class="width_auto" style="width:532px"> <div id="container"> <!--头部,相册选择和格式选择--> <div id="uploader" > <div class="item_container" style="height: 194px"> <div id="" class="queueList" > <div id="dndArea" class="placeholder"> <div id="filePicker"></div> </div> </div> </div> <div class="statusBar" style="display:none;"> <div class="progress"> <span class="text">0%</span> <span class="percentage"></span> </div><div class="info"></div> <div class="btns"> <div id="filePicker2"></div><div class="uploadBtn">开始上传</div> </div> </div> </div> </div> </div> </li> <li> <ul id="imgs"></ul> </li> </ul> <%@ include file="/WEB-INF/views/ctrl/aliyunOSS/aliyunOSS.jsp"%> <form:hidden id="url" path="pictureId" htmlEscape="false" maxlength="255" class="input-xlarge"/>