src/main/java/com/qxueyou/scc/controller/HweiYunOBSController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/controller/UserController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/teach/res/service/HweiYunOBSService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/teach/res/service/impl/HweiYunOBSServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/user/service/IUserRoleService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/user/service/IUserService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/qxueyou/scc/user/service/impl/UserService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.properties | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/qxueyou/scc/controller/HweiYunOBSController.java
@@ -23,6 +23,7 @@ import java.io.InputStream; import java.net.URLEncoder; import java.util.List; import java.util.Map; /** * @ClassName: ObsController @@ -39,11 +40,12 @@ private HweiYunOBSService hweiYunOBSService; @RequestMapping(value = "upload", method = RequestMethod.POST) public List<FileMeta> save(@RequestParam(value = "file", required = false) MultipartFile file) { public List<FileMeta> save(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException { if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { return null; } // if (FileUtil.isEmpty(file)) { // return new Result(false,"文件为空"); // } @@ -52,6 +54,22 @@ return test; } // @RequestMapping(value = "fenpian", method = RequestMethod.POST) // public Map<String, Object> fpsave(@RequestParam(value = "file", required = false) MultipartFile file) throws IOException { // // if (ObjectUtils.isEmpty(file) || file.getSize() <= 0) { // return null; // } // //// if (FileUtil.isEmpty(file)) { //// return new Result(false,"文件为空"); //// } //// final List<FileMeta> test = hweiYunOBSService.fileUpload(file, file.getOriginalFilename()); // Map<String, Object> fnepian = hweiYunOBSService.fnepian(file, file.getOriginalFilename()); //// return ResponseVO.ok("执行成功",test); // return fnepian; // } @RequestMapping(value = "delete", method = RequestMethod.POST) public Result delete(@RequestParam(value = "fileName", required = false) String fileName) { if (StrUtil.isEmpty(fileName)) { src/main/java/com/qxueyou/scc/controller/UserController.java
@@ -175,4 +175,12 @@ return userRoleService.addRole(name,String.valueOf(roleType)); } /** * 统计人数 */ // @PostMapping(value = "countUser") // public Result countUser() { // return userRoleService.addRole(name,String.valueOf(roleType)); // } } src/main/java/com/qxueyou/scc/teach/res/service/HweiYunOBSService.java
@@ -4,8 +4,10 @@ import com.qxueyou.scc.base.model.FileMeta; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Map; /** * @Description 华为云OBS服务接口 @@ -42,6 +44,7 @@ */ List<FileMeta> fileUpload(MultipartFile uploadFile, String objectKey); List<FileMeta> fnepian(MultipartFile uploadFile,String objectKey) throws IOException; /** * @Description 文件下载 * @author wuhuiju src/main/java/com/qxueyou/scc/teach/res/service/impl/HweiYunOBSServiceImpl.java
@@ -19,14 +19,19 @@ import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.aspectj.util.FileUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * @ClassName: HweiYunOBSServiceImpl @@ -160,6 +165,115 @@ return null; } @Override public List<FileMeta> fnepian(MultipartFile uploadFile, String objectKey) throws IOException { ObsClient obsClient = null; List<FileMeta> files = new ArrayList<FileMeta>(2); FileMeta fileMeta = null; // 每个分片的大小,用于计算文件有多少个分片。单位为字节。 final long partSize = 10 * 1024 * 1024L; //10 MB。 String bucketName = hweiOBSConfig.getBucketName(); obsClient = hweiOBSConfig.getInstance(); // objectName 是路径,分片文件最终整合的路径 String objectName = "multipartUpload/"+objectKey; // 创建InitiateMultipartUploadRequest对象。 InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName); InitiateMultipartUploadResult prebuilt = obsClient.initiateMultipartUpload(request); InputStream inputStream = uploadFile.getInputStream(); // 获取全局id String uploadId = prebuilt.getUploadId(); // 如果并发量大的话 初始化线程池 20线程数量 // ExecutorService executorService = Executors.newFixedThreadPool(20); // partTags是PartEtag的集合。PartEtag由分片的ETag和分片号组成。 List<PartEtag> partTags = new ArrayList<PartEtag>(); File file = MultipartFileToFile(uploadFile); // 计算有多少个分片 int partCount = (int) (file.length() / partSize); // 如果取余数不为零则追加一个 if (file.length() % partSize != 0) { partCount++; } try { for (int i = 0; i < partCount; i++) { long startPos = i * partSize; long curPartSize = (i + 1 == partCount) ? (file.length() - startPos) : partSize; // 跳过已经上传的分片。 inputStream.skip(startPos); UploadPartRequest uploadPartRequest = new UploadPartRequest(); uploadPartRequest.setBucketName(bucketName); uploadPartRequest.setObjectKey(objectName); uploadPartRequest.setUploadId(uploadId); uploadPartRequest.setInput(inputStream); // 设置分片大小。除了最后一个分片没有大小限制,其他的分片最小为100 KB。 uploadPartRequest.setPartSize(curPartSize); // 设置分片号。每一个上传的分片都有一个分片号,取值范围是1~10000,如果超出此范围,Obs将返回InvalidArgument错误码。 uploadPartRequest.setPartNumber( i + 1); // 每个分片不需要按顺序上传,甚至可以在不同客户端上传,obs会按照分片号排序组成完整的文件。 UploadPartResult uploadPartResult = obsClient.uploadPart(uploadPartRequest); // 每次上传分片之后,ObS的返回结果包含PartETag。PartETag将被保存在partTags中。 partTags.add(new PartEtag(uploadPartResult.getEtag(), uploadPartResult.getPartNumber())); } // 开始线程池时候使用:等待上传完成 /* executorService.shutdown(); while (!executorService.isTerminated()) { try { executorService.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } }*/ fileMeta = new FileMeta(); // 合并分片段 // 在执行完成分片上传操作时,需要提供所有有效的partETags。obs收到提交的partETags后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,obs将把这些分片组合成一个完整的文件。 CompleteMultipartUploadRequest multipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partTags); // 完成分片上传。 CompleteMultipartUploadResult completeMultipartUploadResult = obsClient.completeMultipartUpload(multipartUploadRequest); // 返回全局id,桶名,对象名称 用于后续处理 比如取消分片上传,查询分片信息等 fileMeta.setPath(completeMultipartUploadResult.getObjectUrl()); fileMeta.setFileSize(uploadFile.getSize() / 1024 + "kb"); fileMeta.setFileType(uploadFile.getContentType()); fileMeta.setFileName(objectKey); files.add(fileMeta); return files; }catch (Exception e){ log.error("分片循环上传失败!"+e.getMessage()); return null; } } public static File MultipartFileToFile(MultipartFile multiFile) { // 获取文件名 String fileName = multiFile.getOriginalFilename(); // 获取文件后缀 String prefix = fileName.substring(fileName.lastIndexOf(".")); // 若须要防止生成的临时文件重复,能够在文件名后添加随机码 try { File file = File.createTempFile(getFileNameNotPrefix(fileName), prefix); multiFile.transferTo(file); return file; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 获取文件名不带后缀 * * @param fileName * @return */ public static String getFileNameNotPrefix(String fileName) { String prefix = fileName.substring(fileName.indexOf(".")); int num = prefix.length();//得到后缀名长度 String fileOtherName = fileName.substring(0, fileName.length() - num);//得到文件名。去掉了后缀 return fileOtherName; } private String getDestPath(String name) { String fileType = getFileType(name); src/main/java/com/qxueyou/scc/user/service/IUserRoleService.java
@@ -96,4 +96,6 @@ * @return */ Result addTeachers(String teacherIds, String roleId); } src/main/java/com/qxueyou/scc/user/service/IUserService.java
@@ -117,4 +117,6 @@ * @param userId */ boolean exists(String account); Result countUser(); } src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java
@@ -172,4 +172,5 @@ return dao.addTeachers(teacherIds, roleId); } } src/main/java/com/qxueyou/scc/user/service/impl/UserService.java
@@ -282,4 +282,10 @@ return findCount("from User where account = ?", CollectionUtils.newList(account)) > 0; } @Override public Result countUser() { String hql = "from count User where sex=? and deleteFlag is false"; return new Result(true,findCount(hql,CollectionUtils.newList(1))); } } src/main/resources/application.properties
@@ -17,6 +17,7 @@ spring.http.multipart.maxFileSize=3000Mb spring.http.multipart.maxRequestSize=3000Mb #mysqldb.datasource.url=jdbc:mysql://rds88t2of1fi184y4s5wo.mysql.rds.aliyuncs.com:3306/scc?useUnicode=true&characterEncoding=GBK&characterSetResults=GBK&zeroDateTimeBehavior=convertToNull #mysqldb.datasource.url=jdbc:mysql://10.1.80.52:3306/rsdb?useUnicode=true&characterEncoding=GBK&characterSetResults=GBK&zeroDateTimeBehavior=convertToNull mysqldb.datasource.url=jdbc:mysql://110.41.147.200:3306/scc?useUnicode=true&characterEncoding=GBK&characterSetResults=GBK&zeroDateTimeBehavior=convertToNull