注册 X
提交 注:点击提交后系统会发送邮件到邮箱验证!(仅支持中国大陆邮箱)
我已阅读并同意 服务条款
首页 > IT技术笔记 > 查看笔记

java实现文件上传,如果存在,实现秒传

附件:

fileinput.min.css (访问密码:335189)

fileinput.min.js (访问密码:335189)

spark-md5.js (访问密码:335189)

java实现文件上传,如果存在,实现秒传

前端实现:

引入fileinput.min.jsspark-md5.js 或 spark-md5.min.js

引入fileinput.min.css

	        
<div class="form-group">
   <label class="col-sm-3 control-label">文件描述:</label>
   <div class="col-sm-8">
      <input class="form-control" type="text" name="remarkFilename" id="remarkFilename" value="" autocomplete="off" >
   </div>
</div>

<div class="form-group">
   <label class="col-sm-3 control-label">是否添加水印</label>
   <div class="col-sm-8">
      <select class="form-control" id="isusewatermark" >
         <option value="true">是</option>
         <option value="false">否</option>
      </select>
   </div>
</div>

<div class="form-group">
   <label class="col-sm-3 control-label">文件md5</label>
   <div class="col-sm-8">
      <input class="form-control" type="text" name="file-md5" id="file-md5" value="" autocomplete="off" >
   </div>
</div>

<div class="form-group" id="file-upload" >
	<label class="font-noraml">多文件上传</label>
		<div class="file-loading">
		<input id="fileinput-demo-1" type="file" name="file" multiple>
	</div>
</div>
<div>
   <label class="font-noraml">上传结果</label>
   <div class="col-sm-8">
      <div id="upload-response" >

      </div>
   </div>
</div>			
	      
	        
<script type="text/javascript">
   var prefix = ctx + "document";

    $(document).ready(function () {
        $("#fileinput-demo-1").fileinput({
            'theme': 'explorer-fas',
            'uploadUrl': prefix + '/addDocument' ,
         maxFileCount: 1,                           //表示允许同时上传的最大文件个数
            overwriteInitial: false,
            initialPreviewAsData: true,
         uploadExtraData: function(previewId, index){      //额外参数的关键点,回调函数,会在上传时调用,读取配置的额外参数
            var obj = {};
            obj.remarkFilename = $("#remarkFilename").val();
            obj.isusewatermark = $("#isusewatermark").val();
            var md5 = $("#file-md5").val();
            obj.md5 = md5;
            console.log(obj);
            if(md5 == ''){
               $.modal.msgWarning('请等待文件md5生成');
            }
            return obj;
         },
         autoReplace: true,                         //是否自动替换当前图片,设置为true时,再次选择文件,会将当前的文件替换掉。
        }).on('filebatchpreupload', function(event, data) {    //该方法将在上传之前触发
         var md5 = $("#file-md5").val();
         if(md5 == ''){                            //错误处理,终止上传
            return {
               message: "请等待md5生成", // 验证错误信息在上传前要显示。如果设置了这个设置,插件会在调用时自动中止上传,并将其显示为错误消息。您可以使用此属性来读取文件并执行自己的自定义验证
               data:{} // any other data to send that can be referred in `filecustomerror`
            };
         }
         //发送md5到文件服务器,验证文件是否已存在
         var res = checkFile(md5);
         console.log(res);
         if (res.code == 0){
            var jsonObject = jQuery.parseJSON(res.msg);
            var text = '文件上传成功,外链url:'+jsonObject.domain+jsonObject.urls+',文件名:{}'+jsonObject.remarkFilename;
            $("#upload-response").text(text);
            return {
               message: "文件秒传成功,"+text, // 验证错误信息在上传前要显示。如果设置了这个设置,插件会在调用时自动中止上传,并将其显示为错误消息。您可以使用此属性来读取文件并执行自己的自定义验证
               data:{} // any other data to send that can be referred in `filecustomerror`
            };
         }

      });
    });
    function checkFile(md5){
       var data = {};
      //var file1 = new File(['text1', 'text2'], 'test.txt', {type: 'text/plain'});
      var formData = new FormData();
      //formData.append("file",file1);  //上传一个files对象
      formData.append("md5", md5);//需要上传的多个参数
      $.ajax({//jQuery方法,此处可以换成其它请求方式
         url: prefix + '/checkFile',
         dataType: "json",
         type: "post",
         async: false,     //同步请求,阻塞方法
         data: formData,
         processData: false,//不去处理发送的数据
         contentType: false,//不去设置Content-Type请求头
         error: function (res) {
            console.log(res);
            data = res;
         },
         success: function (res) {
            console.log(res);
            data = res;
         }
      });
      return data;
   }
    //选择文件后处理事件
    $("#fileinput-demo-1").on("filebatchselected", function(event, files) {
       var num = 0;
      for (var file in files){
         num = num+1;
      }
      if(num>1){
         $("#remarkFilename").val('');
      }
    });
    //文件上传成功后的处理方法
   $("#fileinput-demo-1").on("fileuploaded", function(event, data, previewId, index) {
      console.log('上传成功!')
      console.log(data.response);
      var jsonObject = jQuery.parseJSON(data.response.msg);
      var text = '文件上传成功,外链url:'+jsonObject.domain+jsonObject.urls+',文件名:{}'+jsonObject.remarkFilename;
      $("#upload-response").text(text);
   });
    //计算文件md5,实现文件秒传
   document.getElementById('fileinput-demo-1').addEventListener('change', function () {
      var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice,
            file = this.files[0],
            chunkSize = 2097152,                             // Read in chunks of 2MB
            chunks = Math.ceil(file.size / chunkSize),
            currentChunk = 0,
            spark = new SparkMD5.ArrayBuffer(),
            fileReader = new FileReader();
      fileReader.onload = function (e) {
         console.log('read chunk nr', currentChunk + 1, 'of', chunks);
         spark.append(e.target.result);                   // Append array buffer
         currentChunk++;
         if (currentChunk < chunks) {
            loadNext();
         } else {
            console.log('finished loading');
            var md5 = spark.end();
            $("#file-md5").val(md5);
            console.info('computed hash', md5);  // Compute hash
         }
      };
      fileReader.onerror = function () {
         console.warn('oops, something went wrong.');
      };
      function loadNext() {
         var start = currentChunk * chunkSize,
               end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;
         fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
      }
      loadNext();
   });

</script>			
	      

后端java实现

	        
/**
 * 保存上传文件信息
 * @param fileManager
 * @param isusewatermark 是否给图片添加水印
 * @return
 */
@PostMapping("/addDocument")
@ResponseBody
public AjaxResult addDocument(@RequestParam(value = "file", required = true) MultipartFile file, HttpServletRequest request,FileManager fileManager,boolean isusewatermark) {
    if(file == null){
        return error("未接受到文件");
    }
    if(StringUtils.isBlank(fileManager.getMd5())){
        return error("参数错误,文件MD5未找到!");
    }

    visitDomainName = FileTool.completePath(visitDomainName);
    virtualDirectory = FileTool.completePath(virtualDirectory);
    String ip = Utils.getRemoteIp(request);
    String size = Utils.readableFileSize(file.getSize());
    log.info("接收到来自{}的HTTP请求,文件大小:{},文件名:{},描述:{},文件md5:{},图片是否添加水印:{}" , ip,size,file.getOriginalFilename(),fileManager.getRemarkFilename(),fileManager.getMd5(),isusewatermark);
    BaseService baseService = new BaseService();
    baseService.setIsRecordSql(true);               //开启记录日志
    try {
        JdbcTemplate jdbcTemplate = dynamicDataSourceManager.getDataSourcePoolBySourceID(sourceId);
        baseService.setJdbcTemplate(jdbcTemplate);
        //通过本地上传的文件md5查询文件是否存在,实现文件秒传
        List<FileManager> list = baseService.query(new FileManager(), new Criteria().addAnd(FileManager.PROP_MD5,Operator.EQ,fileManager.getMd5()));
        if(!list.isEmpty()){
            if(StringUtils.isNotBlank(fileManager.getRemarkFilename())){
                FileManager fileManager1 = list.get(0);
                fileManager1.setRemark(fileManager.getRemarkFilename());
                baseService.updateProperties(fileManager1, FileManager.PROP_REMARK);
            }
            log.info("服务器已存在此文件,秒传成功!");
            return success(JSON.toJSONString(list.get(0)));
        }

        //使用uuid生成新的文件名
        String originalFilename = file.getOriginalFilename();
        Map<String, String> map = Utils.getNameAndSuffix(originalFilename);
        String suffix = map.get("suffix");
        fileManager.setUuid(UUIDUtil.getUUID());
        fileManager.setDomain(visitDomainName);
        fileManager.setPrefixPath(virtualDirectory);
        fileManager.setOriginalFilename(originalFilename);
        fileManager.setUploadTime(DateUtils.getNowDate());
        fileManager.setFilesize(file.getSize());
        if(StringUtils.isBlank(fileManager.getRemarkFilename())){
            fileManager.setRemarkFilename(originalFilename);
        }else{
            fileManager.setRemarkFilename(fileManager.getRemarkFilename()+"."+suffix);
        }

        String newFileName = fileManager.getUuid()+"."+suffix;
        String yyyy = DateUtils.getNowDate("yyyy");
        String MM = DateUtils.getNowDate("MM");
        String dd = DateUtils.getNowDate("dd");
        //判断文件是图片还是附件
        String relativePath = "";
        if("pic".equals(Utils.isPic(suffix))) {
            relativePath = "pic"+ FileTool.separator+yyyy+FileTool.separator+MM+FileTool.separator+dd+FileTool.separator+newFileName;
            fileManager.setUrls("upload"+FileTool.separator+relativePath);                              //图片交给tomcat管理
        }else {       //附件
            relativePath = "attach"+ FileTool.separator+yyyy+FileTool.separator+MM+FileTool.separator+dd+FileTool.separator+newFileName;
            fileManager.setUrls("document/download?id="+fileManager.getUuid()+"&type=download");    //附件由服务器接口管理
        }
        fileManager.setSuffixPath(relativePath);

        File theFile = new File(fileManager.getPrefixPath()+fileManager.getSuffixPath());
        if(!theFile.getParentFile().exists()) {
            theFile.getParentFile().mkdirs();
        }
        OutputStream out = new FileOutputStream(theFile);
        // 保存文件 FileCopyUtils是Spring自带的工具类
        FileCopyUtils.copy(file.getInputStream(), out);
        //计算文件md5
        String md5 = FileTool.getFileMD5(theFile);
        fileManager.setMd5(md5);

        log.info("文件保存成功!保存路径:{},文件访问路径:{} ",fileManager.getPrefixPath()+fileManager.getSuffixPath(),fileManager.getDomain()+fileManager.getUrls());
        //判断是否需要添加水印
        if(isusewatermark) {   //添加水印
            if("pic".equals(Utils.isPic(suffix))) {
                Utils.markImageByText(visitDomainName.replace("http://", "").replace("/", ""), theFile.getAbsolutePath(), theFile.getAbsolutePath(), 0, new Color(0,0,0), "JPG");
            }
        }
        int num = baseService.insert(fileManager);
        if(num>0) {
            return success(JSON.toJSONString(fileManager));
        }
        throw new Exception("文件信息入库失败!");
    } catch (Exception e) {
        log.error(ExceptionUtils.getFullStackTrace(e));
        log.info("文件入库失败,开始执行回撤操作");
        //删除数据库记录
        Criteria criteria = new Criteria();
        criteria.addAnd(FileManager.PROP_UUID, Operator.EQ,fileManager.getUuid());
        baseService.deleteBy(fileManager, criteria);
        //删除本地文件记录
        FileTool.deleteFile(fileManager.getPrefixPath()+fileManager.getSuffixPath());
        log.info("回撤操作执行完成!");
    }
    return error();
}

/**
 * 校验文件是否存在,实现文件秒传
 * @param md5
 * @return
 */
@PostMapping("/checkFile")
@ResponseBody
public AjaxResult checkFile(String md5){
    if(StringUtils.isBlank(md5)){
        return error("参数错误,文件MD5未找到!");
    }
    BaseService baseService = new BaseService();
    baseService.setIsRecordSql(true);               //开启记录日志
    try {
        JdbcTemplate jdbcTemplate = dynamicDataSourceManager.getDataSourcePoolBySourceID(sourceId);
        baseService.setJdbcTemplate(jdbcTemplate);
        //通过本地上传的文件md5查询文件是否存在,实现文件秒传
        List<FileManager> list = baseService.query(new FileManager(), new Criteria().addAnd(FileManager.PROP_MD5, Operator.EQ, md5));
        if(!list.isEmpty()){
            log.info("{},{},服务器已存在此文件,秒传成功!",list.get(0).getRemarkFilename(),list.get(0).getUrls());
            return success(JSON.toJSONString(list.get(0)));
        }
    }catch (Exception e){
        log.error(ExceptionUtils.getFullStackTrace(e));
    }
    return error();
}			
	      

FileTool.java工具

	        
public class FileTool {
    public static String getFileMD5(File file) {
       StringBuffer stringbuffer=null;
       try {
          char hexDigits[] = { '0', '1', '2','3', '4','5', '6','7','8', '9', 'a','b' ,'c', 'd','e', 'f' };
          FileInputStream in = new FileInputStream(file);
          FileChannel ch = in.getChannel();
          MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,file.length());
          MessageDigest messagedigest = MessageDigest.getInstance("MD5");
          messagedigest.update(byteBuffer);
          byte[] bytes=messagedigest.digest();
          int n=bytes.length;
          stringbuffer = new StringBuffer(2 * n);
          for (int l = 0; l < n; l++) {
             byte bt=bytes[l];
             char c0 = hexDigits[(bt & 0xf0) >> 4];
             char c1 = hexDigits[bt & 0xf];
             stringbuffer.append(c0);
             stringbuffer.append(c1);
          }
       } catch (Exception e) {
          e.printStackTrace();
       }
       return stringbuffer.toString();
    }
} 			
	      

 打赏        分享



评论

邮箱: 昵称:
\n