阿里雲OOS上傳問題

餘生啊發表於2018-07-05
最近LZ在接這個上傳圖片和視訊已經檔案,看看文件總有些模糊的地方,翻了很多資料都是坑,下面直接貼一下程式碼 希望你們有幫助。
public abstract class AbstractOssClientUtil {
	/**圖片上傳阿里雲域名字首*/
	private final static String URL="https://mrhs.oss-cn-hangzhou.aliyuncs.com/";
	
	private static final String BUCKETNAME="你的桶名";
	
	/**阿里雲上傳地址*/
	private static final String ENDPOINT="http://oss-cn-hangzhou.aliyuncs.com";
	
	/**阿里雲賬戶accessKeyId*/
	private static final String ACCESSKEYID="你的阿里雲key";
	
	/**阿里雲賬戶secretAccessKey*/
	private static final  String SECRETACCESSKEY="你的祕鑰";	
	
	/***
     * 簡單存入 對應  bucket 的檔案     檔案是按照bucketName 存放的,例如傳入"fshop" 則上傳的檔案在 fshop 目錄下, 依次類推, 目前bucketName 
     * 無需繼續建立: 這裡需要注意的是,存入規則需要開發者自定,例如是userIdMOD 5 還是其他方式,最好HASH 打散, 然後資訊儲存到資料庫記錄 
     * 特別要注意的是,中文的相容性, 上傳以後,中文是否做個 alias 對映 比如 '教學視訊.flv'--》aliasName--jxsp20160612.flv realName 和aliasName 關係維護在資料庫中  另外訪問路徑啥的也都寫進去、
     * @param  inputStream輸入檔案流
     * @param  dir 檔案目錄, 例如 :"item/"
     * @param   fileName  上傳檔名
     * @param  fileLength 檔案大小
     * **/
    public  static String putObject(InputStream inputStream,String dir, String fileName, Long fileLength) throws FileNotFoundException {
        // 初始化OSSClient
        OSSClient client = new OSSClient(ENDPOINT,  ACCESSKEYID,  SECRETACCESSKEY);
        // 建立上傳Object的Metadata
        ObjectMetadata meta = new ObjectMetadata();
        // 必須設定ContentLength
        meta.setContentLength(fileLength);
        
        
        String fileNameWithDir;
        if(null == dir) {
        	fileNameWithDir = fileName;
        }else{
        	fileNameWithDir = dir + fileName;
        }
       
        // 上傳Object.  KEY 目前直接用file.getName()
        PutObjectResult result = client.putObject(BUCKETNAME, fileNameWithDir, inputStream, meta);
        String code=result.getETag();
        //生成的URL  可以訪問的URL 
        String returnUrl= URL + fileNameWithDir;
        
        System.out.println("resultUri  --->"+returnUrl);
        // 列印ETag
        System.out.println(result.getETag());
        
        return returnUrl;
        
    }


	/***
	 * 簡單存入 對應  bucket 的檔案     檔案是按照bucketName 存放的,例如傳入"fshop" 則上傳的檔案在 fshop 目錄下, 依次類推, 目前bucketName
	 * 無需繼續建立: 這裡需要注意的是,存入規則需要開發者自定,例如是userIdMOD 5 還是其他方式,最好HASH 打散, 然後資訊儲存到資料庫記錄
	 * 特別要注意的是,中文的相容性, 上傳以後,中文是否做個 alias 對映 比如 '教學視訊.flv'--》aliasName--jxsp20160612.flv realName 和aliasName 關係維護在資料庫中  另外訪問路徑啥的也都寫進去、
	 * @param  inputStream輸入檔案流
	 * @param  dir 檔案目錄, 例如 :"item/"
	 * @param   fileName  上傳檔名
	 * @param  fileLength 檔案大小
	 * **/
	public  static String putObject1(InputStream inputStream,String dir, String fileName, Long fileLength) throws FileNotFoundException {
		// 初始化OSSClient
		OSSClient client = new OSSClient(ENDPOINT,  ACCESSKEYID,  SECRETACCESSKEY);
		// 建立上傳Object的Metadata
		ObjectMetadata meta = new ObjectMetadata();
		// 必須設定ContentLength
		meta.setContentLength(fileLength);


		String fileNameWithDir;
		if(null == dir) {
			fileNameWithDir = fileName;
		}else{
			fileNameWithDir = dir + fileName;
		}

		// 上傳Object.  KEY 目前直接用file.getName()
		PutObjectResult result = client.putObject(BUCKETNAME, fileNameWithDir, inputStream, meta);
		String code=result.getETag();
		//生成的URL  可以訪問的URL
		String returnUrl= URL + fileNameWithDir;

		System.out.println("resultUri  --->"+returnUrl);
		// 列印ETag
		System.out.println(result.getETag());

		return returnUrl;

	}
    
    /**
     * 通過原始名稱獲取隨機名稱的圖片名
     * @param filieName
     * @return
     */
    public static String getFileName(String fileName) {
 		Date date = new Date(System.currentTimeMillis());
 		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmssSSS");
 		String name = simpleDateFormat.format(date);
 		return name + getSixNumStr()+fileName;
 	}
    
    /**
     * 獲取六位數字隨機數
     * @return
     */
    public static String getSixNumStr(){
    	Random random = new Random();
    	StringBuilder sb = new StringBuilder();
    	for(int i = 0; i < 6; i++){
    		sb.append(random.nextInt(10));
    	}
    	return sb.toString();
    }
}

圖片上傳

@ApiOperation(value = "圖片上傳", notes = "目前提供三種上傳模式,1:不傳長寬值則按照原圖上傳,2:傳長寬任意一個值,則會按照圖片進行圖片尺寸壓縮至該尺寸,"
            + "3:長寬都傳一樣的值,則按照所傳尺寸進行上傳,注意不可傳長寬兩個不一樣的值,則圖片會被設定成非正常圖片")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "width", value = "需要傳圖後將圖片寬度設定為該大小", required = false, dataType = "Integer", paramType = "query"),
            @ApiImplicitParam(name = "height", value = "需要傳圖後將圖片高度設定為該大小", required = false, dataType = "Integer", paramType = "query")})
    @PostMapping(value = "/upload", consumes = "multipart/*", headers = "content-type=multipart/form-data")
    @RequestMapping(value = "/img/upload.do", method = RequestMethod.POST)
    public ResponseEntity<JsonResultEntity> upload(@ApiParam(value = "上傳的檔案", required = true) MultipartFile picture,
                                                   @RequestParam(value = "width", defaultValue = "0") Integer width,
                                                   @RequestParam(value = "height", defaultValue = "0") Integer height){
         // 圖片名稱和字尾判斷
         if (checkPic(picture) == false) {
             return ResponseEntity.ok(JsonResultUtils.error(MessageEnum.PIC_NOT_NORM.getCode(),
                     MessageEnum.PIC_NOT_NORM.getMessage()));
         }
        //將MultipartFile轉為File型別方便圖片轉換
        PicUploadVo picFileType = changeMultipartFileToFile(picture);
        picFileType.setWidth(width);
        picFileType.setHeight(height);
        //對圖片進行處理
        PicUploadVo returnPicUploadVo = new PicUploadVo();
        if (width == 0 && height == 0) {
            //未設定長寬則按原圖只是壓縮
            returnPicUploadVo = compressFile(picFileType);
        } else if (width == 0 || height == 0) {
            //未設定長寬中某一個值則對該圖片對應的等比例壓縮
            returnPicUploadVo = proportionFile(picFileType);
        } else {
            //設定了長寬則對圖片進行按照長寬壓縮
            returnPicUploadVo = squarePic(picFileType);
        }
        //設定上傳檔案的檔名
        String fileName = "_" + returnPicUploadVo.getImageHeight() + "X" + returnPicUploadVo.getImageWidth() + picFileType.getFileType();
        try {
            String url = AbstractOssClientUtil.putObject(returnPicUploadVo.getInputStream(), FILE_PATH, AbstractOssClientUtil.getFileName(fileName), returnPicUploadVo.getSize());
            return ResponseEntity.ok(JsonResultUtils.success(url, MessageEnum.AD_STATUS_OK.getCode(),
                    MessageEnum.AD_STATUS_OK.getMessage()));
        } catch (Exception e) {
            logger.error(e.getMessage());
            return ResponseEntity.ok(JsonResultUtils.error(MessageEnum.PIC_UPLOAD_ERROR.getCode(),
                    MessageEnum.PIC_UPLOAD_ERROR.getMessage()));
        }
    }
具體例子打包發在檔案裡面 拿下去可以直接用

相關文章