Java IO流阿里云OSS上传照片
声明:这个为我个人原创 我没有copy别人的代码 但我看他们写的代码块都是一致的 连错误都是 很容易误导别人 我写代码的时候一直想不通 后面解决之后 就想自己写一个给遇到有相同问题的小伙伴扩散一下思维
-好了 说下我的代码 是从前端request请求过来到我后端controller层这边
你可以先打个断点 debug一下 看你的request请求过来的文件是什么类型 我就是这里被其他博客的误导了 当时一直强转报错 就很纳闷 然后我自己Debug去找原因 原来是接收的类型应该是你request请求过来的类型 接着取出file给Iterator 因为可能是多张照片上传 单张的话while就只循环一次 我把jar包都贴最上面
-controller层
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.util.Iterator;
import java.util.Map;
/**
* @author:Dylan
* @date: 2020/4/7
* @time: 14:48
* @desc: 工作台
*/
@Controller
@RequestMapping("/test/dylanName/")
public class DylanNameController{
/**
* 客户信息-头像上传
* @param request
* @return
*/
@ResponseBody
@RequestMapping(value = "saveCustomerFile", method = RequestMethod.POST)
public Map saveCustomerFile(HttpServletRequest request) {
Map map = new HashMap();
//"此处对应要转换成 你request传递过来的文件类型,否则没法获取multifile对象请注意"
MultipartHttpServletRequest httpServletRequest = (MultipartHttpServletRequest) request;
Iterator<String> iterator = httpServletRequest.getFileNames();
while (iterator.hasNext()) {
MultipartFile files = httpServletRequest.getFile(iterator.next());
map = new AliyunOSS().saveDTAliyunFile(files, AliyunUploadAddress.CUSTOMER_IMG);
}
return map;
}
}
-接着来看下阿里云的具体实现方法saveDTAliyunFile()
-AliyunOSS().saveDTAliyunFile() 阿里云的具体jar包可以在我demo这里下载 我附上阿里云的demo下载 aliyun-oss-demo.zip
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.utils.IOUtils;
import com.aliyun.oss.model.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 阿里云OSS功能类
*/
public class AliyunOSS {
// 允许上传的格式
private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"};
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
private String ossEndpoint;
private OSS ossClient;
/**
* 图片接口上传
* @param files 上传文件
* @param fileFolder 上传文件夹
* @return
*/
public Map saveDTAliyunFile(MultipartFile files,String fileFolder) {
Map imgInfoMap = new HashMap();
if(files != null && !files.isEmpty()){
MultipartFile multipartFile = files;
// 1. 对上传的图片进行校验: 这里简单校验后缀名
boolean isLegal = false;
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
isLegal = true;
break; // 只要与允许上传格式其中一个匹配就可以
}
}
// 格式错误, 返回与前端约定的error
if (!isLegal) {
imgInfoMap.put("resultStatus","error");
imgInfoMap.put("resultMsg","图片格式错误");
return imgInfoMap;
}
try {
// 2. 准备上传API的参数
String fileName = multipartFile.getOriginalFilename();//文件名称
String filePath = getFilePath(fileName,fileFolder);//给定文件路径
//给定字节输入流读取
InputStream is = multipartFile.getInputStream();
saveIs(is,filePath);
String fileUrl = AliyunOSS.getOSSUrl()+filePath;
imgInfoMap.put("fileUrl",fileUrl);
imgInfoMap.put("fileName",multipartFile.getOriginalFilename());
imgInfoMap.put("resultStatus","ok");
imgInfoMap.put("resultMsg","成功");
} catch (IOException e) {
log.i("阿里云上传图片失败"+e);
} finally {
destroy();
}
}
return imgInfoMap;
}
/**
* 上传的目录
* 目录: 根据年月日归档
* 文件名: 时间戳 + 随机数
* @param fileName
* @return
*/
public String getFilePath(String fileName,String fileFolder) {
String filePath = "";
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
try {
filePath = fileFolder+"/" + DateUtil.ConvertDateToString(new Date(), "yyyy") + "/" + DateUtil.ConvertDateToString(new Date(), "MM") + "/"
+ DateUtil.ConvertDateToString(new Date(), "dd") + "/" +
df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + StringUtils.substringAfterLast(fileName, ".");
} catch (ParseException e) {
e.printStackTrace();
}
return filePath;
}
/**
* 上传网络流
* @param inputStream
* @param objectName
*/
public void saveIs(InputStream inputStream,String objectName){// objectName表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如:abc/efg/123.jpg。
ossClient.putObject(bucketName, objectName, inputStream);
}
/**
* 读取阿里云上传地址
*/
public static String getOSSUrl(){
Properties properties = PropertiesUtil.getProperties_1("/aliyunOss.properties");
String url = "http://" + properties.getProperty("bucketName") + "." + properties.getProperty("ossEndpoint") + "/";
return url;
}
/**
* 时间转对应格式
*/
public static String ConvertDateToString(Date date, String patten) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(patten);
return sdf.format(date);
}
}
-最后看下阿里云的上传路径 我是用aliyunOss.properties存放的 不想用这个可以直接写入自己的配置 不清楚自己配置信息的直接去阿里云管理台查看
#阿里云oss配置
ossEndpoint=写你的ossEndpoint
accessKeyId=写你的accessKeyId
accessKeySecret=写你的accessKeySecret
bucketName=写你的bucketName
-最后文件就上传成功了 实现类最终会返回到我controller层的map里 在map里通过fileUrl就可以取出图片路径 好啦 拜了个拜