日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里云文件上传工具类

發布時間:2024/9/30 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里云文件上传工具类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件實體類

@Data public class UploadFile {private String fileName;private String fileType;private long fileSize;private String timeStampName;private int success;private String message;private String url;private Integer storageType;//切片上傳相關參數private String taskId;private int chunkNumber;private long chunkSize;private int totalChunks;private String identifier;private long totalSize;private long currentChunkSize;}

文件上傳工具父類:

@Slf4j public abstract class Uploader {public static final String ROOT_PATH = "upload";public static final String FILE_SEPARATOR = "/";// 文件大小限制,單位KBpublic final int maxSize = 10000000;public abstract List<UploadFile> upload(HttpServletRequest request, UploadFile uploadFile);public abstract void cancelUpload(UploadFile uploadFile);/*** 獲取本地文件保存路徑** @return*/protected String getLocalFileSavePath() {String path = ROOT_PATH;SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");path = FILE_SEPARATOR + path + FILE_SEPARATOR + formater.format(new Date());String staticPath = PathUtil.getStaticPath();File dir = new File(staticPath + path);//LOG.error(PathUtil.getStaticPath() + path);if (!dir.exists()) {try {boolean isSuccessMakeDir = dir.mkdirs();if (!isSuccessMakeDir) {log.error("目錄創建失敗:" + PathUtil.getStaticPath() + path);}} catch (Exception e) {log.error("目錄創建失敗" + PathUtil.getStaticPath() + path);return "";}}return path;}/*** 依據原始文件名生成新文件名** @return*/protected String getTimeStampName() {try {SecureRandom number = SecureRandom.getInstance("SHA1PRNG");return "" + number.nextInt(10000)+ System.currentTimeMillis();} catch (NoSuchAlgorithmException e) {log.error("生成安全隨機數失敗");}return ""+ System.currentTimeMillis();}public synchronized boolean checkUploadStatus(UploadFile param, File confFile) throws IOException {RandomAccessFile confAccessFile = new RandomAccessFile(confFile, "rw");//設置文件長度confAccessFile.setLength(param.getTotalChunks());//設置起始偏移量confAccessFile.seek(param.getChunkNumber() - 1);//將指定的一個字節寫入文件中 127,confAccessFile.write(Byte.MAX_VALUE);byte[] completeStatusList = FileUtils.readFileToByteArray(confFile);confAccessFile.close();//不關閉會造成無法占用//創建conf文件文件長度為總分片數,每上傳一個分塊即向conf文件中寫入一個127,那么沒上傳的位置就是默認的0,已上傳的就是127for (int i = 0; i < completeStatusList.length; i++) {if (completeStatusList[i] != Byte.MAX_VALUE) {return false;}}confFile.delete();return true;}protected String getFileName(String fileName){if (!fileName.contains(".")) {return fileName;}return fileName.substring(0, fileName.lastIndexOf("."));} }

阿里云文件上傳子類:

package com.qiwenshare.ufo.operation.upload.product;import com.alibaba.fastjson.JSON; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.*; import com.qiwenshare.common.util.FileUtil; import com.qiwenshare.ufo.autoconfiguration.UFOAutoConfiguration; import com.qiwenshare.ufo.autoconfiguration.UFOProperties; import com.qiwenshare.ufo.exception.UploadException; import com.qiwenshare.ufo.operation.upload.Uploader; import com.qiwenshare.ufo.operation.upload.domain.UploadFile; import com.qiwenshare.ufo.util.PathUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.util.*;@Slf4j @Component public class AliyunOSSUploader extends Uploader {// partETags是PartETag的集合。PartETag由分片的ETag和分片號組成。public static Map<String, List<PartETag>> partETagsMap = new HashMap<String, List<PartETag>>();public static Map<String, UploadFileInfo> uploadPartRequestMap = new HashMap<>();public static Map<String, OSS> ossMap = new HashMap<>();@Overridepublic List<UploadFile> upload(HttpServletRequest httpServletRequest, UploadFile uploadFile) {log.info("開始上傳upload");List<UploadFile> saveUploadFileList = new ArrayList<>();StandardMultipartHttpServletRequest request = (StandardMultipartHttpServletRequest) httpServletRequest;boolean isMultipart = ServletFileUpload.isMultipartContent(request);if (!isMultipart) {throw new UploadException("未包含文件上傳域");}Iterator<String> iter = request.getFileNames();while (iter.hasNext()) {saveUploadFileList = doUpload(request, iter, uploadFile);}log.info("結束上傳");return saveUploadFileList;}private List<UploadFile> doUpload(StandardMultipartHttpServletRequest standardMultipartHttpServletRequest, Iterator<String> iter, UploadFile uploadFile) {String savePath = getLocalFileSavePath();OSS ossClient = getClient(uploadFile);List<UploadFile> saveUploadFileList = new ArrayList<>();try {MultipartFile multipartfile = standardMultipartHttpServletRequest.getFile(iter.next());String timeStampName = getTimeStampName();String originalName = multipartfile.getOriginalFilename();String fileName = getFileName(originalName);String fileType = FileUtil.getFileExtendName(originalName);uploadFile.setFileName(fileName);uploadFile.setFileType(fileType);uploadFile.setTimeStampName(timeStampName);String ossFilePath = savePath + FILE_SEPARATOR + timeStampName + FILE_SEPARATOR + fileName + "." + fileType;String confFilePath = savePath + FILE_SEPARATOR + uploadFile.getIdentifier() + "." + "conf";File confFile = new File(PathUtil.getStaticPath() + FILE_SEPARATOR + confFilePath);synchronized (AliyunOSSUploader.class) {if (uploadPartRequestMap.get(uploadFile.getIdentifier()) == null) {InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(UFOAutoConfiguration.aliyunConfig.getOss().getBucketName(), ossFilePath.substring(1));InitiateMultipartUploadResult upresult = ossClient.initiateMultipartUpload(request);String uploadId = upresult.getUploadId();UploadFileInfo uploadPartRequest = new UploadFileInfo();uploadPartRequest.setBucketName(UFOAutoConfiguration.aliyunConfig.getOss().getBucketName());uploadPartRequest.setKey(ossFilePath.substring(1));uploadPartRequest.setUploadId(uploadId);uploadPartRequestMap.put(uploadFile.getIdentifier(), uploadPartRequest);}}UploadFileInfo uploadFileInfo = uploadPartRequestMap.get(uploadFile.getIdentifier());UploadPartRequest uploadPartRequest = new UploadPartRequest();uploadPartRequest.setBucketName(uploadFileInfo.getBucketName());uploadPartRequest.setKey(uploadFileInfo.getKey());uploadPartRequest.setUploadId(uploadFileInfo.getUploadId());uploadPartRequest.setInputStream(multipartfile.getInputStream());uploadPartRequest.setPartSize(uploadFile.getCurrentChunkSize());uploadPartRequest.setPartNumber(uploadFile.getChunkNumber());log.info(JSON.toJSONString(uploadPartRequest));UploadPartResult uploadPartResult = ossClient.uploadPart(uploadPartRequest);synchronized (AliyunOSSUploader.class) {log.info("上傳結果:" + JSON.toJSONString(uploadPartResult));if (partETagsMap.get(uploadFile.getIdentifier()) == null) {List<PartETag> partETags = new ArrayList<PartETag>();partETags.add(uploadPartResult.getPartETag());partETagsMap.put(uploadFile.getIdentifier(), partETags);} else {partETagsMap.get(uploadFile.getIdentifier()).add(uploadPartResult.getPartETag());}}boolean isComplete = checkUploadStatus(uploadFile, confFile);if (isComplete) {log.info("分片上傳完成");completeMultipartUpload(uploadFile);uploadFile.setUrl("/" + uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey());uploadFile.setSuccess(1);uploadFile.setMessage("上傳成功");partETagsMap.remove(uploadFile.getIdentifier());uploadPartRequestMap.remove(uploadFile.getIdentifier());ossMap.remove(uploadFile.getIdentifier());} else {uploadFile.setSuccess(0);uploadFile.setMessage("未完成");}} catch (Exception e) {log.error("上傳出錯:" + e);throw new UploadException(e);}uploadFile.setStorageType(1);uploadFile.setFileSize(uploadFile.getTotalSize());saveUploadFileList.add(uploadFile);return saveUploadFileList;}/*** 將文件分塊進行升序排序并執行文件上傳。*/protected void completeMultipartUpload(UploadFile uploadFile) {List<PartETag> partETags = partETagsMap.get(uploadFile.getIdentifier());Collections.sort(partETags, Comparator.comparingInt(PartETag::getPartNumber));UploadFileInfo uploadFileInfo = uploadPartRequestMap.get(uploadFile.getIdentifier());CompleteMultipartUploadRequest completeMultipartUploadRequest =new CompleteMultipartUploadRequest(UFOAutoConfiguration.aliyunConfig.getOss().getBucketName(),uploadFileInfo.getKey(),uploadFileInfo.getUploadId(),partETags);log.info("----:" + JSON.toJSONString(partETags));// 完成上傳。CompleteMultipartUploadResult completeMultipartUploadResult = getClient(uploadFile).completeMultipartUpload(completeMultipartUploadRequest);log.info("----:" + JSON.toJSONString(completeMultipartUploadRequest));getClient(uploadFile).shutdown();//}private void listFile(UploadFile uploadFile) {// 列舉已上傳的分片,其中uploadId來自于InitiateMultipartUpload返回的結果。ListPartsRequest listPartsRequest = new ListPartsRequest(UFOAutoConfiguration.aliyunConfig.getOss().getBucketName(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId());// 設置uploadId。//listPartsRequest.setUploadId(uploadId);// 設置分頁時每一頁中分片數量為100個。默認列舉1000個分片。listPartsRequest.setMaxParts(100);// 指定List的起始位置。只有分片號大于此參數值的分片會被列舉。 // listPartsRequest.setPartNumberMarker(1);PartListing partListing = getClient(uploadFile).listParts(listPartsRequest);for (PartSummary part : partListing.getParts()) {log.info("分片號:"+part.getPartNumber() + ", 分片數據大小: "+part.getSize() + ",分片的ETag:"+part.getETag()+ ", 分片最后修改時間:"+ part.getLastModified());// 獲取分片號。part.getPartNumber();// 獲取分片數據大小。part.getSize();// 獲取分片的ETag。part.getETag();// 獲取分片的最后修改時間。part.getLastModified();}}/*** 取消上傳*/@Overridepublic void cancelUpload(UploadFile uploadFile) {AbortMultipartUploadRequest abortMultipartUploadRequest =new AbortMultipartUploadRequest(UFOAutoConfiguration.aliyunConfig.getOss().getBucketName(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getKey(), uploadPartRequestMap.get(uploadFile.getIdentifier()).getUploadId());getClient(uploadFile).abortMultipartUpload(abortMultipartUploadRequest);}private synchronized OSS getClient(UploadFile uploadFile) {OSS ossClient = null;if (ossMap.get(uploadFile.getIdentifier()) == null) {ossClient = new OSSClientBuilder().build(UFOAutoConfiguration.aliyunConfig.getOss().getEndpoint(), UFOAutoConfiguration.aliyunConfig.getOss().getAccessKeyId(), UFOAutoConfiguration.aliyunConfig.getOss().getAccessKeySecret());ossMap.put(uploadFile.getIdentifier(), ossClient);} else {ossClient = ossMap.get(uploadFile.getIdentifier());}return ossClient;}@Datapublic class UploadFileInfo {private String bucketName;private String key;private String uploadId;}}

路徑工具類

import com.qiwenshare.common.constant.FileConstant; import com.qiwenshare.ufo.autoconfiguration.UFOAutoConfiguration; import org.apache.commons.lang3.StringUtils; import org.springframework.util.ResourceUtils;import java.io.File; import java.io.FileNotFoundException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder;public class PathUtil {/*** 獲取項目所在的根目錄路徑 resources路徑* @return*/public static String getProjectRootPath() {String absolutePath = null;try {String url = ResourceUtils.getURL("classpath:").getPath();absolutePath = urlDecode(new File(url).getAbsolutePath()) + File.separator;} catch (FileNotFoundException e) {e.printStackTrace();}return absolutePath;}/*** 路徑解碼* @param url* @return*/public static String urlDecode(String url){String decodeUrl = null;try {decodeUrl = URLDecoder.decode(url, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return decodeUrl;}/*** 得到static路徑** @return*/public static String getStaticPath() {String localStoragePath = UFOAutoConfiguration.localStoragePath;//PropertiesUtil.getProperty("qiwen-file.local-storage-path")if (StringUtils.isNotEmpty(localStoragePath)) {return localStoragePath;}else {String projectRootAbsolutePath = getProjectRootPath();int index = projectRootAbsolutePath.indexOf("file:");if (index != -1) {projectRootAbsolutePath = projectRootAbsolutePath.substring(0, index);}return projectRootAbsolutePath + "static" + File.separator;}}public static String getParentPath(String path) {return path.substring(0, path.lastIndexOf(FileConstant.pathSeparator));}}

總結

以上是生活随笔為你收集整理的阿里云文件上传工具类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性bbw | 色婷婷av一区二区三区之e本道 | 久久免费久久 | 91视频二区 | 久久久噜噜噜www成人 | 久久久久久久9999 | 青青草五月天 | 免费看欧美一级特黄a大片 国产免费的av | 强伦人妻一区二区三区 | 国产sm调教视频 | 亚洲热在线观看 | 日本成人精品在线 | 欧美日韩高清在线 | 丰满人妻中伦妇伦精品app | 天堂中文字幕av | 欧美日韩中文字幕在线 | 欧美一级专区免费大片 | 免费观看黄色网页 | 99热久久这里只有精品 | 国产免费av片在线观看 | 在线视频麻豆 | 在线观看av一区 | 最全aⅴ番号库网 | 免费av网站在线 | 日韩一级| 无码人妻aⅴ一区二区三区69岛 | 一本毛片 | 午夜视频在线免费看 | 黄色在线一区 | 小宵虎南在线观看 | 色综合网站 | 亚洲一区 在线播放 | 日韩中文字幕在线一区 | 韩国三级视频在线观看 | 黄频视频在线观看 | 久久久久久91香蕉国产 | 国产视频一区在线 | 午夜影院免费体验区 | 激情视频在线播放 | 亚洲综合自拍 | 影音先锋成人资源站 | 精品人妻天天爽夜夜爽视频 | 一级特黄特色的免费大片视频 | 午夜视频污 | 欧美激情999 | 人妻无码中文久久久久专区 | 日韩中文字幕亚洲精品欧美 | 久久成年人视频 | 自拍偷拍亚洲天堂 | 国产对白videos麻豆高潮 | 黑人巨大精品欧美一区二区蜜桃 | 欧洲三级视频 | 久久久免费毛片 | 日韩白浆 | 日本一本久 | 日韩免费视频一区二区视频在线观看 | 天天综合国产 | 日韩av图片| 亚洲香蕉 | 亚洲免费自拍 | 男女那个视频 | 日日草视频 | 欧美日韩a级片 | 天天av综合| 日日摸日日添日日碰9学生露脸 | jizz日本视频 | av噜噜| 免费在线观看黄视频 | av天堂永久资源网 | 一级免费片 | 国产精品成人电影在线观看 | 水蜜桃av在线 | 亚洲高潮av | 免费成人深夜夜行p站 | 人人草人人爱 | 中文字幕精品在线观看 | 香蕉亚洲 | 性久久久久久久久久久 | 不用播放器av | 三级视频网站在线观看 | 成人在线一区二区三区 | 午夜宫| 天堂成人国产精品一区 | 欧美亚洲在线 | 久久天堂精品 | 欧美性69 | 午夜一区二区三区在线 | 丁香花电影在线观看免费高清 | 欧美午夜精品一区二区蜜桃 | 色爱综合区 | 日本人体视频 | 探花av在线| 91蜜桃网 | 亚洲香蕉在线观看 | 色欲国产精品一区二区 | 亚洲爽爽 | 狂野欧美性猛交xxxx | 亚洲欧洲综合 | 91系列在线观看 |