文件上傳
此文件上傳可上傳各類常規的文件對象,例如:圖片的png/jpg/gif、視頻的MP4/MOV、文檔文件等,基本上都可以通過這個方法上傳;
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。