发表于: 2020-09-02 23:30:08

1 1433


今天完成的事

根据网上教程终于实现了上传图片到阿里云然后显示出图片。

封装了一个工具类

//文件存储目录
private String filedir = "data/";

private OSS ossClient;

public OSSClientUtil() {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}

/**
* 初始化
*/
public void init() {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}

/**
* 销毁
*/
public void destory() {
ossClient.shutdown();
}

/**
* 上传图片
*
* @param url
*/
public void uploadImg2Oss(String url) throws ImgException {
File fileOnServer = new File(url);
   FileInputStream fin;
   try {
fin = new FileInputStream(fileOnServer);
       String[] split = url.split("/");
       this.uploadFile2OSS(fin, split[split.length - 1]);

   } catch (FileNotFoundException e) {
throw new ImgException("图片上传失败");
   }
}


public String uploadImg2Oss(MultipartFile file) throws ImgException {
if (file.getSize() > 1024 * 1024) {
throw new ImgException("上传图片大小不能超过1M");
   }
String originalFilename = file.getOriginalFilename();
   String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
   Random random = new Random();
   String name = random.nextInt(10000) + System.currentTimeMillis() + substring;
   try {
InputStream inputStream = file.getInputStream();
       this.uploadFile2OSS(inputStream, name);
       return name;
   } 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.filedir + split[split.length - 1]);
   }
return null;
}

/**
* 上传到OSS服务器  如果同名文件会覆盖服务器上的
*
* @param instream 文件流
* @param fileName 文件名称 包括后缀名
* @return 出错返回"" ,唯一MD5数字签名
*/
public String uploadFile2OSS(InputStream instream, String fileName) {
String ret = "";
   try {
//创建上传ObjectMetadata
       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, filedir + 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();
       }
}
return ret;
}

/**
* Description: 判断OSS服务文件上传时文件的contentType
*
* @param FilenameExtension 文件后缀
* @return String
*/
public static String getcontentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/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(".xml")) {
return "text/xml";
   }
return "image/jpeg";
}

/**
* 获得url链接
*
* @param key
* @return
*/
public String getUrl(String key) {
// 设置URL过期时间为10  3600l* 1000*24*365*10
   Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 10);
   // 生成URL
   URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
   if (url != null) {
return url.toString();
   }
return null;
}

service

@Override
public String updateHead(MultipartFile file, int userId) throws IOException, ImgException {
if (file == null || file.getSize() <= 0) {
throw new ImgException("头像不能为空");
   }
String name = ossClient.uploadImg2Oss(file);
   String imgUrl = ossClient.getImgUrl(name);
   ossClient.destory();
   User user=new User();
   user.setId(userId);
   user.setImage(imgUrl);
   //根据id更新数据库里的头像url
   userMapper.updateHead(user);
   return imgUrl;
}


controller

@RequestMapping(value = "/img",method = RequestMethod.POST)
public String uploadImg(@RequestParam MultipartFile file,Model model){
try {
String head = userService.updateHead(file, 1);
       model.addAttribute("data", head);
   } catch (IOException e) {
e.printStackTrace();

   } catch (ImgException e) {
e.printStackTrace();
   }
return "upload";
}

成果


明天的计划:

把这个工具类的实现思路整理一遍,然后自己封装一个。

遇到的问题:

上传图片后,不知道用oss的哪个类型获取url。

收获:



返回列表 返回列表
评论

    分享到