发表于: 2021-04-10 23:02:54

1 1279


今天完成的事情:
图片上传成功,
图片迁移失败




明天计划的事情:
图片迁移
深度思考
任务8


遇到的问题:
存入数据库的: 图片的网址包含密钥id和签名  感觉不是很安全
图片迁移的时候,一直报错
2021-04-10 23:03:47 CST WARN  org.springframework.context.support.AbstractApplicationContext558refresh - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tilesConfigurer' defined in class path resource [spring/spring-mvc.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: No ServletContext available
2021-04-10 23:03:47 CST ERROR org.springframework.test.context.TestContextManager231prepareTestInstance - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@2ed2d9cb] to prepare test instance [OssAndCosTest@47e2e487] java.lang.IllegalStateException: Failed to load ApplicationContext


收获:
上传图片:
/**
* 阿里密钥
*/
@Value("${AliMail.acceKeyId}")
private String accessKeyId;
@Value("${AliMail.accessKeySecret}")
private String accessKeySecret;
/**
* 腾讯密钥
*/
@Value("${TxSMS.secretId}")
private String tencentAccessKeId;
@Value("${TxSMS.secretKey}")
private String tencentAccessKeySecret;
/**
* 阿里图片上传
*/
@Value("${AliOSS.endpoint}")
private String endpoint;
@Value("${AliOSS.bucketName}")
private String bucketName;
@Value("${AliOSS.content}")
private String content;
/**
* 腾讯图片上传
*/
@Value("${TxCOS.endpoint}")
private String txEndpoint;
@Value("${TxCOS.bucketName}")
private String txBucketName;
@Value("${TxCOS.content}")
private String txContent;
/**
* 上传文件到阿里云OSS
*
* @param file
* @return
* @throws 
*/
public String uploadImgOSS(MultipartFile file) throws ImgException {
// 获取上传的文件名全称
String Filename = file.getOriginalFilename();
// 获取上传文件的后缀名,并改成小写
String suffix = Filename.substring(Filename.lastIndexOf(".")).toLowerCase();
// 使用 UUID 给图片重命名,并去掉四个“-”
String newFileName = UUID.randomUUID().toString().replaceAll("-", "")+suffix;
try {
InputStream inputStream = file.getInputStream();
this.uploadFileOSS(inputStream, newFileName);
return newFileName;
} catch (Exception e) {
throw new ImgException("图片上传失败");
}
}
/**
* 获得图片路径
*
* @param fileUrl
* @return
*/
public String getImgUrl(String fileUrl) {
if (!StringUtils.isEmpty(fileUrl)) {
String[] split = fileUrl.split("/");
return this.getUrl(this.content + split[split.length - 1]);
}
return null;
}
/**
* 上传到阿里云OSS服务器 如果同名文件会覆盖服务器上的
*
* @param instream 文件流
* @param fileName 文件名称 包括后缀名
* @return 出错返回"" ,唯一MD5数字签名
*/
public String uploadFileOSS(InputStream instream, String fileName) {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String ret = "";
try {
//创建上传ObjectMetadata,这是用户对object的描述
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(instream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
//设置文件类型
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName);
//上传文件
PutObjectResult putResult = ossClient.putObject(bucketName, content + fileName, instream, objectMetadata);
ret = putResult.getETag();
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
//关闭资源
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
ossClient.shutdown();
return ret;
}



接口:

/**
* 上传头像接口
* @param file
* @param model
* @param request
* @return
*/
@RequestMapping(value = "/u/upload/image",method = RequestMethod.POST)
public String uploadImg(@RequestParam MultipartFile file, Model model, HttpServletRequest request){
try {
String head = userService.upHeadPortrait(file, request.getParameter("username"));
model.addAttribute("data", head);
} catch (ImgException e) {
e.printStackTrace();
}
return "uploadFile";
}



上传成功:

<img src="${data}" width="200px" height="180px">
<br>
<h4><font color="#a52a2a" size="4">文件名: ${newFileName}</font></h4>



图片迁移:

/**
* 图片迁移
*/
public void OssAndCos(String localPath) {
/**
* 腾讯云信息
*/
// 1 初始化用户身份信息(secretId, secretKey)。
String secretId = tencentAccessKeId;
String secretKey =tencentAccessKeySecret;
COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 2 设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
Region region = new Region("ap-shenzhen-fsi");
ClientConfig clientConfig = new ClientConfig(region);
// 3 生成 cos 客户端。
COSClient cosClient = new COSClient(cred, clientConfig);
/**
* 阿里云信息
*/
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// // 设置最大个数。
// final int maxKeys = 100;
//构造ListObjectRequest请求
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
//设置为“/"时,罗列该文件夹下所有的文件
listObjectsRequest.setDelimiter("/");
listObjectsRequest.setPrefix("image/");
ObjectListing listing = ossClient.listObjects(listObjectsRequest);
//遍历该文件夹下的所有文件
for (OSSObjectSummary ossObjectSummary : listing.getObjectSummaries()) {
String key = ossObjectSummary.getKey();
//判断文件所在本地路径是否存在,若无,则创建目录
File file = new File(localPath + key);
//获取父目录
File fileParent = file.getParentFile();
// 创建它所在的文件夹的目录,(该文件夹不存在的话,创建)
if (!fileParent.exists()) {
fileParent.mkdirs();
}
// 下载Object到文件
ossClient.getObject(new GetObjectRequest(bucketName, key), file);
// 指定要上传到的存储桶
String bucketName = txBucketName;
// 指定要上传到 COS 上对象键
com.qcloud.cos.model.PutObjectRequest putObjectRequest = new com.qcloud.cos.model.PutObjectRequest(bucketName, key, file);
com.qcloud.cos.model.PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
System.out.println("路径=======" + file.getAbsoluteFile());
System.out.println("key======" + key);
}
ossClient.shutdown();
cosClient.shutdown();
}





返回列表 返回列表
评论

    分享到