@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public String test(HttpServletRequest request, HttpServletResponse response) {
Map<String,Object> map = new HashMap<>();
String filePath = "";
try {
// 跨域设置
response.setHeader("Access-Control-Allow-Origin", "*"); //生产环境绝对不允许设置为“*”
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile imgFile = multipartRequest.getFile("fileupload");
// 过滤文件
if(!FileUtils.accept(imgFile.getOriginalFilename())){
logger.info("File: " + imgFile.getOriginalFilename() + " is illegal file.");
return null;
}
//上传图片
if (!imgFile.isEmpty()) {
String filename = imgFile.getOriginalFilename();
//FastDFSFile fdfsFile;
//fdfsFile = new FastDFSFile(imgFile.getName(), imgFile.getBytes(), prefix);
//filePath = FileManager.upload(fdfsFile);
filePath = CosClientUtils.uploadFile(imgFile,request);
}
} catch (Exception e) {
logger.error("webuploader error", e);
}
return filePath;
}
package com.neixunbao.platform.qcloud;
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.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;
import com.qcloud.cos.transfer.Download;
import com.qcloud.cos.transfer.TransferManager;
import com.qcloud.cos.transfer.TransferManagerConfiguration;
import com.qcloud.cos.transfer.Upload;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Author:
* @Date: 2022年1月10日17:39:08
* @Description: java实现腾讯云存储服务(COSClient)
* @REGIONID 区域
* @KEY 上传上云之后的名字
* @KEY01 需要删除的文件
*/
public class CosClientUtils {
private final static String SECRET_ID = "";
private final static String SECRET_KEY = "";
//存储桶名称
private final static String BUCKETNAME = "";
//区域
private final static String REGIONID = "ap-beijing";
//地址
private final static String BASEURL = "";
// 创建 TransferManager 实例,这个实例用来后续调用高级接口
static TransferManager createTransferManager() {
// 创建一个 COSClient 实例,这是访问 COS 服务的基础实例。
// 详细代码参见本页: 简单操作 -> 创建 COSClient
COSClient cosClient = createCOSClient();
// 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源
// 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。
ExecutorService threadPool = Executors.newFixedThreadPool(32);
// 传入一个 threadpool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。
TransferManager transferManager = new TransferManager(cosClient, threadPool);
// 设置高级接口的配置项
// 分块上传阈值和分块大小分别为 5MB 和 1MB
TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration();
transferManagerConfiguration.setMultipartUploadThreshold(5*1024*1024);
transferManagerConfiguration.setMinimumUploadPartSize(1*1024*1024);
transferManager.setConfiguration(transferManagerConfiguration);
return transferManager;
}
static void shutdownTransferManager(TransferManager transferManager) {
// 指定参数为 true, 则同时会关闭 transferManager 内部的 COSClient 实例。
// 指定参数为 false, 则不会关闭 transferManager 内部的 COSClient 实例。
transferManager.shutdownNow(true);
}
/**
* 初始化CosClient相关配置, appid、accessKey、secretKey、region
* @return
*/
public static COSClient createCOSClient() {
// 1 初始化用户身份信息(secretId, secretKey)。
// SECRETID和SECRETKEY请登录访问管理控制台 https://console.cloud.tencent.com/cam/capi 进行查看和管理
COSCredentials cred = new BasicCOSCredentials(SECRET_ID, SECRET_KEY);
// 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
Region region = new Region(REGIONID);
ClientConfig clientConfig = new ClientConfig(region);
// 这里建议设置使用 https 协议
// 从 5.6.54 版本开始,默认使用了 https
clientConfig.setHttpProtocol(HttpProtocol.https);
// 以下的设置,是可选的:
// 设置 socket 读取超时,默认 30s
clientConfig.setSocketTimeout(30*1000);
// 设置建立连接超时,默认 30s
clientConfig.setConnectionTimeout(30*1000);
// 如果需要的话,设置 http 代理,ip 以及 port
//clientConfig.setHttpProxyIp("httpProxyIp");
//clientConfig.setHttpProxyPort(80);
// 3 生成 cos 客户端。
COSClient cosClient = new COSClient(cred, clientConfig);
return cosClient;
}
/**
* 上传文件
*
* @return
*/
public static String uploadFile(MultipartFile imgFile, HttpServletRequest request) {
//转为File
String filename = imgFile.getOriginalFilename();
String prefix = filename.substring(filename.lastIndexOf(".") + 1);//后缀
String path=request.getSession().getServletContext().getRealPath("/filetool");//生成一个目录
String uuid= UUID.randomUUID().toString().replace("-","");//customer_YYYYMMDDHHMM
String fileName = uuid+"."+prefix; //文件全路径
File file=new File(path,fileName);
//如果path路径不存在,创建一个文件夹
if(!file.exists()){
file.mkdirs();
}
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKETNAME, fileName, file);
TransferManager transferManager = createTransferManager();
try {
imgFile.transferTo(file);//没有这句话,生成的文件就是一个文件夹。有了以后,就会在path路径下,生成一个文件
// 高级接口会返回一个异步结果Upload
// 可同步地调用 waitForUploadResult 方法等待上传完成,成功返回UploadResult, 失败抛出异常
Upload upload = transferManager.upload(putObjectRequest);
UploadResult uploadResult = upload.waitForUploadResult();
dfsdelete(file.toString());
return BASEURL+uploadResult.getKey();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
shutdownTransferManager(transferManager);
}
return "";
}
/**
* 下载文件
*
* @param
* @param
* @return
*/
public static String downLoadFile(String fullFileName) {
File downFile = new File(fullFileName);
// 使用高级接口必须先保证本进程存在一个 TransferManager 实例,如果没有则创建
// 详细代码参见本页:高级接口 -> 创建 TransferManager
TransferManager transferManager = createTransferManager();
String key = "exampleobject";
// 本地文件路径
String localFilePath = "/path/to/localFile";
File downloadFile = new File(localFilePath);
GetObjectRequest getObjectRequest = new GetObjectRequest(BUCKETNAME, fullFileName);
try {
// 返回一个异步结果 Donload, 可同步的调用 waitForCompletion 等待下载结束, 成功返回 void, 失败抛出异常
Download download = transferManager.download(getObjectRequest, downloadFile);
download.waitForCompletion();
return download.getBucketName();
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
shutdownTransferManager(transferManager);
}
return "";
}
/**
* 删除文件
*
* @param path
*/
public static void deleteFile(String path) {
// 调用 COS 接口之前必须保证本进程存在一个 COSClient 实例,如果没有则创建
// 详细代码参见本页:简单操作 -> 创建 COSClient
COSClient cosClient = createCOSClient();
try {
// 存储桶的命名格式为 BucketName-APPID,此处填写的存储桶名称必须为此格式
// 对象键(Key)是对象在存储桶中的唯一标识。详情请参见 [对象键](https://cloud.tencent.com/document/product/436/13324)
String key = "exampleobject";
cosClient.deleteObject(BUCKETNAME, key);
} catch (CosServiceException e) {
e.printStackTrace();
} catch (CosClientException e) {
e.printStackTrace();
}finally {
cosClient.shutdown();
}
}
/**
* 创建桶
*
* @param bucketName
* @return
* @throws CosClientException
* @throws CosServiceException
*/
public static Bucket createBucket(String bucketName) throws CosClientException, CosServiceException {
COSClient cc = createCOSClient();
Bucket bucket = null;
try {
bucket = cc.createBucket(bucketName);
} catch (CosClientException e) {
e.printStackTrace();
} finally {
}
return bucket;
}
;
/**
* 删除桶
*
* @param bucketName
* @throws CosClientException
* @throws CosServiceException
*/
public static void deleteBucket(String bucketName) throws CosClientException, CosServiceException {
COSClient cc = createCOSClient();
try {
cc.deleteBucket(bucketName);
} catch (CosClientException e) {
e.printStackTrace();
} finally {
}
}
;
/**
* 判断桶是否存在
*
* @param bucketName
* @return
* @throws CosClientException
* @throws CosServiceException
*/
public boolean doesBucketExist(String bucketName) throws CosClientException, CosServiceException {
COSClient cc = createCOSClient();
boolean bucketExistFlag = cc.doesBucketExist(bucketName);
return bucketExistFlag;
}
;
/**
* 查看桶文件
*
* @param bucketName
* @return
* @throws CosClientException
* @throws CosServiceException
*/
public static ObjectListing listObjects(String bucketName) throws CosClientException, CosServiceException {
COSClient cc = createCOSClient();
// 获取 bucket 下成员(设置 delimiter)
ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
listObjectsRequest.setBucketName(bucketName);
// 设置 list 的 prefix, 表示 list 出来的文件 key 都是以这个 prefix 开始
listObjectsRequest.setPrefix("");
// 设置 delimiter 为/, 即获取的是直接成员,不包含目录下的递归子成员
listObjectsRequest.setDelimiter("/");
// 设置 marker, (marker 由上一次 list 获取到, 或者第一次 list marker 为空)
listObjectsRequest.setMarker("");
// 设置最多 list 100 个成员,(如果不设置, 默认为 1000 个,最大允许一次 list 1000 个 key)
listObjectsRequest.setMaxKeys(100);
ObjectListing objectListing = cc.listObjects(listObjectsRequest);
// 获取下次 list 的 marker
String nextMarker = objectListing.getNextMarker();
// 判断是否已经 list 完, 如果 list 结束, 则 isTruncated 为 false, 否则为 true
boolean isTruncated = objectListing.isTruncated();
List<COSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
for (COSObjectSummary cosObjectSummary : objectSummaries) {
// get file path
String key = cosObjectSummary.getKey();
// get file length
long fileSize = cosObjectSummary.getSize();
// get file etag
String eTag = cosObjectSummary.getETag();
// get last modify time
Date lastModified = cosObjectSummary.getLastModified();
// get file save type
String StorageClassStr = cosObjectSummary.getStorageClass();
}
return objectListing;
}
/**
* 生成文件路径
*
* @return
*/
private String getFileKey(String originalfileName) {
String filePath = "test/";
//1.获取后缀名 2.去除文件后缀 替换所有特殊字符
return filePath;
}
public static void dfsdelete(String path) {
File file=new File(path);
if(file.isFile()) {//如果此file对象是文件的话,直接删除
file.delete();
return;
}
//当 file是文件夹的话,先得到文件夹下对应文件的string数组 ,递归调用本身,实现深度优先删除
String [] list=file.list();
for (int i = 0; i < list.length; i++) {
dfsdelete(path+File.separator+list[i]);
}//当把文件夹内所有文件删完后,此文件夹已然是一个空文件夹,可以使用delete()直接删除
file.delete();
return;
}
}