Java IO流阿里云OSS上传照片

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就可以取出图片路径 好啦 拜了个拜

你可能感兴趣的:(编程)