diff --git a/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/BigFileUploadController.java b/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/BigFileUploadController.java index b3160c5..044ab7f 100644 --- a/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/BigFileUploadController.java +++ b/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/BigFileUploadController.java @@ -71,22 +71,16 @@ public String fileUpload(String guid, MultipartFile file) { String fileName; try { - int xuhao; - String path = FileUploadController.class.getResource("/").getFile(); - int index = path.indexOf("build"); - String tempPath = "/src/main/webapp/upload/"; - String uploadFolderPath = path.substring(0, index) + tempPath; + int index; + String uploadFolderPath = getRealPath(); - //创建临时文件夹保存分块文件 - String newTempPath = tempPath + guid + "/"; - //分块文件临时保存路径 - String mergePath = path.substring(0, index) + newTempPath; + String mergePath =uploadFolderPath + guid + "/"; String ext = name.substring(name.lastIndexOf(".")); //判断文件是否分块 if (chunks != null && chunk != null) { - xuhao = Integer.parseInt(chunk); - fileName = String.valueOf(xuhao) + ext; + index = Integer.parseInt(chunk); + fileName = String.valueOf(index) + ext; // 将文件分块保存到临时文件夹里,便于之后的合并文件 saveFile(mergePath, fileName, file); // 验证所有分块是否上传成功,成功的话进行合并 @@ -98,6 +92,7 @@ public String fileUpload(String guid, } } catch (Exception ex) { + ex.printStackTrace(); return "{\"error\":true}"; } diff --git a/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/FileUploadController.java b/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/FileUploadController.java index e1c51bf..6138bef 100644 --- a/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/FileUploadController.java +++ b/src/main/java/com/zhangzhihao/FileUpload/Java/Controller/FileUploadController.java @@ -37,13 +37,12 @@ public String fileUpload(@RequestParam("id") String id, @RequestParam("lastModifiedDate") String lastModifiedDate, @RequestParam("size") int size, @RequestParam("file") MultipartFile file) { - String fileName = ""; + String fileName; try { - String realPath = getRealPath(); String ext = name.substring(name.lastIndexOf(".")); fileName = UUID.randomUUID().toString() + ext; - saveFile(realPath, fileName, file); + saveFile(getRealPath(), fileName, file); } catch (Exception ex) { return "{\"error\":true}"; } diff --git a/src/main/java/com/zhangzhihao/FileUpload/Java/Service/FileService.java b/src/main/java/com/zhangzhihao/FileUpload/Java/Service/FileService.java index 53212b4..edbd5f6 100644 --- a/src/main/java/com/zhangzhihao/FileUpload/Java/Service/FileService.java +++ b/src/main/java/com/zhangzhihao/FileUpload/Java/Service/FileService.java @@ -6,6 +6,7 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import java.util.List; @Service public class FileService extends BaseService { @@ -14,13 +15,13 @@ public class FileService extends BaseService { public boolean isMd5Exist(String md5) { Query query = new Query(entityManager); - Object resultMD5 = query.from(File.class) + @SuppressWarnings("unchecked") List result = query.from(File.class) .select() .whereEqual("MD5", md5) .createTypedQuery() - .getSingleResult(); + .getResultList(); - return resultMD5 != null; + return !result.isEmpty(); } } diff --git a/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/IsAllUploaded.java b/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/IsAllUploaded.java index 99021e2..edb24e2 100644 --- a/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/IsAllUploaded.java +++ b/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/IsAllUploaded.java @@ -8,13 +8,14 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import static com.zhangzhihao.FileUpload.Java.Utils.MergeFile.mergeFile; public class IsAllUploaded { - private static List uploadInfoList; + private final static List uploadInfoList = new ArrayList(); /** * @param md5 @@ -30,7 +31,9 @@ public static boolean isAllUploaded(@NotNull final String md5, .size(); boolean bool = (size == Integer.parseInt(chunks)); if (bool) { - uploadInfoList.removeIf(item -> item.getMd5() == md5); + synchronized (uploadInfoList) { + uploadInfoList.removeIf(item -> Objects.equals(item.getMd5(), md5)); + } } return bool; } @@ -53,10 +56,9 @@ public static void Uploaded(@NotNull final String md5, @NotNull final String ext, @NotNull final FileService fileService) throws Exception { - if (uploadInfoList == null) { - uploadInfoList = new ArrayList(); + synchronized (uploadInfoList) { + uploadInfoList.add(new UploadInfo(md5, chunks, chunk, uploadFolderPath, fileName, ext)); } - uploadInfoList.add(new UploadInfo(md5, chunks, chunk, uploadFolderPath, fileName, ext)); boolean allUploaded = isAllUploaded(md5, chunks); int chunksNumber = Integer.parseInt(chunks); diff --git a/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/MergeFile.java b/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/MergeFile.java index 02d2e39..a2cf63a 100644 --- a/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/MergeFile.java +++ b/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/MergeFile.java @@ -24,7 +24,7 @@ public static void mergeFile(final int chunksNumber, throws Exception { /*合并输入流*/ String mergePath = uploadFolderPath + guid + "/"; - SequenceInputStream s = null; + SequenceInputStream s ; InputStream s1 = new FileInputStream(mergePath + 0 + ext); InputStream s2 = new FileInputStream(mergePath + 1 + ext); s = new SequenceInputStream(s1, s2); diff --git a/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/SaveFile.java b/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/SaveFile.java index 734465f..333639f 100644 --- a/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/SaveFile.java +++ b/src/main/java/com/zhangzhihao/FileUpload/Java/Utils/SaveFile.java @@ -14,6 +14,7 @@ public class SaveFile { + private static final File uploadDirectory = new File(getRealPath()); /** * @param savePath * @param fileFullName @@ -30,9 +31,16 @@ public static boolean saveFile(@NotNull final String savePath, File uploadFile = new File(savePath + fileFullName); //判断文件夹是否存在,不存在就创建一个 File fileDirectory = new File(savePath); - if (!fileDirectory.exists()) { - if (!fileDirectory.mkdir()) { - throw new Exception("文件夹创建失败!路径为:" + savePath); + synchronized (uploadDirectory){ + if(!uploadDirectory.exists()){ + if(!uploadDirectory.mkdir()){ + throw new Exception("保存文件的父文件夹创建失败!路径为:" + savePath); + } + } + if (!fileDirectory.exists()) { + if (!fileDirectory.mkdir()) { + throw new Exception("文件夹创建失败!路径为:" + savePath); + } } } @@ -53,7 +61,7 @@ public static byte[] readInputStream(InputStream inStream) throws Exception { //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 - int len = 0; + int len; //使用一个输入流从buffer里把数据读取出来 while ((len = inStream.read(buffer)) != -1) { //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 diff --git a/src/main/webapp/WEB-INF/views/BigFileUpload/Index.jsp b/src/main/webapp/WEB-INF/views/BigFileUpload/Index.jsp index 11f441a..d2d9209 100644 --- a/src/main/webapp/WEB-INF/views/BigFileUpload/Index.jsp +++ b/src/main/webapp/WEB-INF/views/BigFileUpload/Index.jsp @@ -38,7 +38,7 @@ //formData: { guid: WebUploader.guid() }, //一个文件有一个guid,在服务器端合并成一个文件 这里有个问题,多个文件或者上传一个文件成功后不刷新直接添加文件上传生成的guid不变!!! 暂时只能传一个大文件(已解决) //fileNumLimit :1, fileSizeLimit: 2000 * 1024 * 1024,//最大2GB - fileSingleSizeLImit: 2000 * 1024 * 1024, + fileSingleSizeLimit: 2000 * 1024 * 1024, resize: false//不压缩 @@ -51,15 +51,12 @@ //} }); - - - // 当有文件被添加进队列的时候 uploader.on('fileQueued', function (file) { $list.append('
' + '

' + file.name + '

' + - '

等待上传...

' + - '
');//id="' + file.id + 'btn" + '

正在计算文件MD5...请等待计算完毕后再点击上传!

' + + ''); //删除要上传的文件 //每次添加文件都给btn-delete绑定删除方法 $(".btn-delete").click(function () { @@ -78,6 +75,9 @@ //insertLog("
" + moment().format("YYYY-MM-DD HH:mm:ss") + " before-send-file preupload:计算文件(" + file.name + ")MD5完成. 耗时 " + (end - start) + '毫秒 fileMd5: ' + fileMd5); file.wholeMd5 = fileMd5;//获取到了md5 uploader.options.formData.md5value = file.wholeMd5;//每个文件都附带一个md5,便于实现秒传 + + $('#' + file.id).find('p.state').text('MD5计算完毕,可以点击上传了'); + $.ajax({//向服务端发送请求 cache: false, type: "post", @@ -195,23 +195,13 @@ } }); - - - uploader.on('uploadAccept', function (file, response) { - //if (uploader.errorCode) { - // // 通过return false来告诉组件,此文件上传有错。 - // return false; - //} - if (response._raw == '{"error":true}') { + if (response._raw === '{"error":true}') { return false; } }); }); - - -

AltStyle によって変換されたページ (->オリジナル) /