文件上传
1、官方文档:
简单上传:分为流式上传和文件上传。流式上传使用InputStream作为文件的数据源。文件上传使用本地文件作为OSS文件的数据源。
https://help.aliyun.com/document_detail/84781.html?spm=a2c4g.11174283.6.944.21967da2h9PbDz
上传形式还有:表单上传、断点上传、分片上传等,文档都在路径中可找到;
2、jar包:
阿里云官方依赖包(看着就那么几个,其实里面东西不少,文件上传中真正用的也不算多)
第三步的代码中使用得到的主要有这么几个,这些只是那几个jar包中的几个子类:
import com.aliyun.oss.HttpMethod; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClient; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.GeneratePresignedUrlRequest; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult;
3、同步上传代码:
// OSS所在服务区地址(在所购买的OSS存储对象空间信息中会有,一般也就是杭州的) private static String endpoint="https://oss-cn-hangzhou.aliyuncs.com"; // OSS对象存储空间访问身份验证账户和密钥 private static String accessKeyId="*************"; private static String accessKeySecret="********************"; // OSS对象存储空间名 private static String bucketName="*********************"; // OSS存储空间中的文件目录 private static String fileDir = "***/***/"; private OSSClient ossClient; public OSSUpload1() { ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * @Author qtl * @Description 同步上传 * @Date 18:31 2020/10/14 * @Param [file] * @return java.lang.String **/ public String uploadImg2Oss(MultipartFile file) { // 获取文件名 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); } catch (Exception e) { e.printStackTrace(); } return name; } /** * @Author qtl * @Description 上传到OSS服务器 如果同名文件会覆盖服务器上的,因此在文件命名上采用时间戳(毫秒级)来命名上传成功的文件 * @Date 10:55 2020/9/16 * @Param [instream, fileName] * @return java.lang.String **/ public String uploadFile2OSS(InputStream instream, String fileName) { String ret = ""; try { // 创建上传Object的Metadata 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) { e.printStackTrace(); } finally { try { if (instream != null) { instream.close(); } } catch (IOException e) { e.printStackTrace(); } } // 这个返回值就是上传成功后在OSS文件对象存储的文件名【例:1607605931087.jpg】 return ret; }
上面的代码使用的是本地文件上传的形式,在使用此代码时需要有两个条件:
1、开通OSS服务;
2、创建存储空间(文件存储路径其实也可以不用创建,直接在代码中写上路径,在上传过程中如果发现没有此目录就会自动创建);
3、创建AccessKey。