OSS |
1、首先引入所需依赖的jar包。这是Maven的配置。
<!-- oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.2.3</version>
</dependency>
2、创建一个工具类OssUpload.java,代码如下
package com.jdy.utils;
import com.alibaba.fastjson.JSON;
import com.jdy.core.util.StringUtil;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.model.ObjectMetadata;
import com.qcloud.cos.model.PutObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import com.qcloud.cos.model.UploadResult;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.Upload;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.xml.rpc.ServiceException;
import java.io.*;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @author Frank.Hou
*
*/
public class OssUpload {
private static Logger logger= LoggerFactory.getLogger(OssUpload.class);
private static final int socketTimeout=60*3*1000;
private static final int ConnectionTimeout=60*3*1000;
private static final int IdleConnectionTime=60*3*1000;
private static COSClient client;
private static final Date expiration = new Date(new Date().getTime() + 3600 * 1000 * 24 * 365 * 10);
public static void instance() {
synchronized (COSClient.class) {
COSCredentials cred = new BasicCOSCredentials("AKIDwzrX0HuEsJdljVMwSoz1rVwCG8oHpfaJ", "mNlxwBJF7qPmwwlOpFUbXGn7KLAmCPSJ");
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
client = new COSClient(cred, clientConfig);;
}
}
public static enum UploadCategory {
BUCKER_IMG("jdy-1252753627");
private String path;
UploadCategory(String path) {
this.path = path;
}
public String getPath() {
return path;
}
}
public static synchronized String upload(MultipartFile file, HttpServletRequest request, UploadCategory uploadCategory, String type) throws ServiceException {
instance();
String parentPath = request.getSession().getServletContext().getRealPath("/");
BufferedInputStream bufInput = null;
BufferedOutputStream bufOut = null;
OutputStream fileOutputStream=null;
File dest = null;
try {
logger.info("OSS 上传 创建文件执行===============================================================");
String newfilename= StringUtil.get32UUID()+"."+ FilenameUtils.getExtension(file.getOriginalFilename());
dest= new File(parentPath, "tmp/oss/"+newfilename);//.createTempFile(file.getName(), "."+FilenameUtils.getExtension(file.getOriginalFilename()),new File(parentPath));
if (!dest.getParentFile().exists()) {
if (!dest.getParentFile().mkdirs()) {
throw new ServiceException("创建目录失败 " + dest.getParentFile().getAbsolutePath());
}
}
bufInput = new BufferedInputStream(file.getInputStream());
bufOut = new BufferedOutputStream(new FileOutputStream(dest));
int temp = 0;
fileOutputStream = new FileOutputStream(dest, true);
while ((temp = bufInput.read()) != -1) {
fileOutputStream.write(temp);
}
IOUtils.copy(bufInput, bufOut);
return uploadMaxFile(dest.getAbsolutePath(), uploadCategory.getPath(), dest.getName(), type);
} catch (Exception e) {
e.printStackTrace();
}finally {
IOUtils.closeQuietly(bufOut);
IOUtils.closeQuietly(bufInput);
IOUtils.closeQuietly(fileOutputStream);
client.shutdown();
dest.delete();
}
return null;
}
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
// 如果文件路径所对应的文件存在,并且是一个文件,则直接删除
if (file.exists() && file.isFile()) {
if (file.delete()) {
System.out.println("删除单个文件" + fileName + "成功!");
return true;
} else {
System.out.println("删除单个文件" + fileName + "失败!");
return false;
}
} else {
System.out.println("删除单个文件失败:" + fileName + "不存在!");
return false;
}
}
public static void main(String[] args) throws InterruptedException {
COSCredentials cred = new BasicCOSCredentials("AKIDwzrX0HuEsJdljVMwSoz1rVwCG8oHpfaJ", "mNlxwBJF7qPmwwlOpFUbXGn7KLAmCPSJ");
ClientConfig clientConfig = new ClientConfig(new Region("ap-beijing"));
COSClient cosclient = new COSClient(cred, clientConfig);
String bucketName = "jdy-1252753627";
File localFile = new File("D:\\a.jpg");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, new Date().getTime() + localFile.getName(), localFile);
PutObjectResult putObjectResult = cosclient.putObject(putObjectRequest);
System.out.println(JSON.toJSONString(putObjectResult));
// File downFile = new File("D:\\wallhaven-497789.png");
// GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, localFile.getName());
// ObjectMetadata downObjectMeta = cosclient.getObject(getObjectRequest, downFile);
cosclient.shutdown();
}
private static String uploadMaxFile(String localpath, String bucketName, String filename, String type) throws ServiceException {
Calendar cal = Calendar.getInstance();
String path = "/" + type + "/" + cal.get(cal.YEAR) + (cal.get(cal.MONTH) + 1) + cal.get(cal.DATE) + "/";
try {
File localFile = new File(localpath);
// if(localFile.)
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, path + filename, localFile);
ExecutorService threadPool = Executors.newFixedThreadPool(32);
// 传入一个 threadpool, 若不传入线程池, 默认 TransferManager 中会生成一个单线程的线程池。
TransferManager transferManager = new TransferManager(client, threadPool);
// 本地文件上传
Upload upload = transferManager.upload(putObjectRequest);
// 等待传输结束(如果想同步的等待上传结束,则调用 waitForCompletion)
UploadResult uploadResult = upload.waitForUploadResult();
System.out.println(JSON.toJSONString(uploadResult));
} catch (Throwable e) {
e.printStackTrace();
logger.error("OSS 大文件上传失败-----------{}", e.getMessage());
throw new ServiceException(e.getMessage());
}
URL url = client.generatePresignedUrl(bucketName, path + filename, expiration);
logger.info("FILE URL========={}", url.toString());
System.out.println(url.toString());
return url.toString().substring(0, url.toString().indexOf("?sign"));
}
private static String uploadMaxFile(InputStream InputStream, String bucketName, String filename) throws ServiceException {
try {
// if(localFile.)
ExecutorService threadPool = Executors.newFixedThreadPool(32);
// 传入一个 threadpool, 若不传入线程池, 默认 TransferManager 中会生成一个单线程的线程池。
TransferManager transferManager = new TransferManager(client, threadPool);
ObjectMetadata objectMetadata = new ObjectMetadata();
// 设置输入流长度为 500
// 本地文件上传
Upload upload = transferManager.upload(bucketName, filename, InputStream, objectMetadata);
// 等待传输结束(如果想同步的等待上传结束,则调用 waitForCompletion)
UploadResult uploadResult = upload.waitForUploadResult();
System.out.println(JSON.toJSONString(uploadResult));
} catch (Throwable e) {
e.printStackTrace();
logger.error("OSS 大文件上传失败-----------{}",e.getMessage());
throw new ServiceException(e.getMessage());
}
URL url = client.generatePresignedUrl(bucketName, filename, expiration);
logger.info("FILE URL========={}",url.toString());
System.out.println(url.toString());
return url.toString().substring(0,url.toString().indexOf("?sign"));
}
}
3、前台页面的使用
<div class="zc-inputbox">
<div class="zc-txt"><em>*</em>项目LOGO</div>
<div class="zf-block">
<div id="pic_div" class="chuan-btn">
<input class="chuan-btn-input" type="file" data-LUploader='pic_div'
data-form-file='basestr' data-upload-type='front'
class="chuan-btn-input" type="file"
accept="image/*"/>
<ul class="LUploader-list"></ul>
<a href=javascript:void(0)><img id="showPicLogo" name="" src="${list.project.pic}"/></a>
<%--<input type="button" class="zf-xbtn" value="点击上传">--%>
<%--<em>jpg,png,gif格式,小于1MB,不低于268x226 等比例</em>--%>
</div>
</div>
</div>
4、绑定js
document.querySelectorAll('input[data-LUploader]').forEach(function (el) {
new LUploader(el, {
url: '${ctx}/front/file/uploadBase64.action',//post请求地址
multiple: false,//是否一次上传多个文件 默认false
//maxsize: 102400,//忽略压缩操作的文件体积上限 默认100kb
accept: 'image',//可上传的图片类型
quality: 0.1,//压缩比 默认0.1 范围0.1-1.0 越小压缩率越大
showsize: false//是否显示原始文件大小 默认false
});
});
5、controller中的使用
@Controller
@RequestMapping(value = "/front/file")
public class FrontFileBaseController extends BaseController {
@RequestMapping(value = "/uploadBase64")
@ResponseBody
public Map<String, Object> uploadBase64(String formFile, String luploader, HttpServletRequest request) {
Map<String, Object> ret = new HashMap<String, Object>();
String url = uploadWithBase64(formFile);
//String url ="1111.png";
ret.put("file_name", luploader);
ret.put("file_size", "1");
ret.put("status", 0);
ret.put("msg", "上传成功");
ret.put("url", url);
return ret;
}