WebUploader 文件上传优化总结

来源:互联网 发布:游戏机算法 编辑:程序博客网 时间:2024/05/08 00:05

http://itindex.net/detail/49267-webuploader-%E6%96%87%E4%BB%B6-%E4%B8%8A%E4%BC%A0

WebUploader 文件上传优化总结

public void fileUpload(HttpServletRequest request,
            HttpServletResponse response)throws ServletException {
        try{
            String path = request.getParameter("path");
            path = path !=null ? java.net.URLDecoder.decode(path,"utf-8")
                    :"";
            booleanisMultipart = ServletFileUpload.isMultipartContent(request);
  
            if(isMultipart) {
                FileItemFactory factory =new DiskFileItemFactory();
                ServletFileUpload upload =new ServletFileUpload(factory);
  
                // 得到所有的表单域,它们目前都被当作FileItem                List<FileItem> fileItems = upload.parseRequest(request);
  
                String id ="";
                String fileName ="";
                // 如果大于1说明是分片处理                int chunks = 1;
                intchunk = 0;
                FileItem tempFileItem =null;
  
                for(FileItem fileItem : fileItems) {
                    if(fileItem.getFieldName().equals("id")) {
                        id = fileItem.getString();
                    }else if(fileItem.getFieldName().equals("name")) {
                        fileName =new String(fileItem.getString().getBytes(
                                "ISO-8859-1"),"UTF-8");
                    }else if(fileItem.getFieldName().equals("chunks")) {
                        chunks = NumberUtils.toInt(fileItem.getString());
                    }else if(fileItem.getFieldName().equals("chunk")) {
                        chunk = NumberUtils.toInt(fileItem.getString());
                    }else if(fileItem.getFieldName().equals("file")) {
                        tempFileItem = fileItem;
                    }
                }
  
                // 临时目录用来存放所有分片文件                String tempFileDir = getTempFilePath()
                        + File.separator + id;
                File parentFileDir =new File(tempFileDir);
                if(!parentFileDir.exists()) {
                    parentFileDir.mkdirs();
                }
                // 分片处理时,前台会多次调用上传接口,每次都会上传文件的一部分到后台(默认每片为5M)                File tempPartFile = newFile(parentFileDir, fileName + "_"+ chunk
                        +".part");
                FileUtils.copyInputStreamToFile(tempFileItem.getInputStream(),
                        tempPartFile);
  
                // 是否全部上传完成                // 所有分片都存在才说明整个文件上传完成                boolean uploadDone = true;
                for(int i = 0; i < chunks; i++) {
                    File partFile =new File(parentFileDir, fileName +"_" + i
                            +".part");
                    if(!partFile.exists()) {
                        uploadDone =false;
                    }
                }
                // 所有分片文件都上传完成                // 将所有分片文件合并到一个文件中                if (uploadDone) {
                    File destTempFile =new File(getTempFilePath(), fileName);
                    for(int i = 0; i < chunks; i++) {
                        File partFile =new File(parentFileDir, fileName +"_"
                                + i +".part");
  
                        FileOutputStream destTempfos =new FileOutputStream(
                                destTempFile,true);
  
                        FileUtils.copyFile(partFile, destTempfos);
  
                        destTempfos.close();
                    }
                    // 得到 destTempFile 就是最终的文件                    // 添加到文件系统或者存储中                     
                    // 删除临时目录中的分片文件                    FileUtils.deleteDirectory(parentFileDir);
                    // 删除临时文件                    destTempFile.delete();
                      
                    ResponseUtil.responseSuccess(response,null);
                }else {
                    // 临时文件创建失败                    if (chunk == chunks -1) {
                        FileUtils.deleteDirectory(parentFileDir);
                        ResponseUtil.responseFail(response,"500", "内部错误");
                    }
                }
            }
        }catch (Exception e) {
            logger.error(e.getMessage(), e);
            ResponseUtil.responseFail(response,"500", "内部错误");
        }
    }
0 0
原创粉丝点击