webkitdirectory 实现文件夹上传(包含文件夹大小和文件个数的校验)

需要特别说明的是:并不是全部的浏览器都支持按照文件夹进行上传,目前只有谷歌浏览器还有Microsoft Edge支持按照文件夹进行上传,具体可以看下百度云盘的网页版的上传按钮,在火狐下就支持按照文件进行上传,而在谷歌和Edge下,就会给用户提供一个下拉,让用户选择是根据文件进行上传还是根据文件夹进行上传。

而在谷歌浏览器下,也不是没有条件的支持,必须在input上加入一个属性:webkitdirectory后才会予以支持。

1、前端使用的JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8"  
    pageEncoding="UTF-8"%>  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Insert title here</title>  
    <script src="../resource/js/jquery/jquery-2.2.3.js" type="text/javascript"></script>
    <script type="text/javascript" src="ajaxfileupload.js"></script>
    
</head>  
<body>  
       <div id="content">文件夹形式上传</br>
<!--         <h1>使用本功能时请使用谷歌浏览器</h1> -->
<!--         <div style="clear:both;content:'';"></div> -->
<!--         <br> -->
<!--         <u><font size="5">按照文件夹进行上传的功能只被个别浏览器支持,如谷歌,Microsoft Edge浏览器</font></u> -->
<!--         <div style="clear:both;content:'';"></div> -->
<!--         <br>         -->
<form  role="form" id="fileUploadForm" action="../upload/uploadFolder" name="fileUploadForm" method="post" enctype="multipart/form-data">  
              <div class="form-group">  
                <input id="fileFolder" name="fileFolder" type="file" webkitdirectory><span id="msg" style="color:#F00"></span>  
              </div>  
              <button type="button"  id="subButton" οnclick="commit()">Submit</button>  
            </form>  
</body>  
<script type="text/javascript" src="scanUpload.js"></script>
</html>  
2、 scanUpload.js:

//页面提示信息  
var msg;  
//文件数量限制  
var filesCount=2000;  
//文件夹大小限制 2000M  
var filesSize=2147483648;  
//实际的文件数量  
var actual_filesCount=0;  
//实际的文件夹大小  
var actual_filesSize=0;  
  
function commit(){  
    //判断是否选中文件夹  
    var file=$("#fileFolder").val();  
    if(file==''){  
        $("#msg").text('请选择要上传的文件夹');  
        return;  
    }  
      
    $("#fileUploadForm").submit();  
//    ajaxfileupload.js 插件提交
//    $.ajaxFileUpload({
//         url:"../upload/uploadFolder",//需要链接到服务器地址   
//          secureuri:false,  
//          fileElementId:"fileFolder",//文件选择框的id属性  ,//文件选择框的id属性  
//          dataType: 'json',   //json 
//          contentType: false,    //不可缺
//          processData: false,    //不可缺
//          success: function (data){
//            if(data!=null){
//              alert(data);
//            }else{
//                alert("上传失败");
//            }                   
//        },
//        error:function(XMLHttpRequest, textStatus, errorThrown){  
//        	console.log(XMLHttpRequest);
//        	console.log(textStatus);
//        	console.log(errorThrown);
//            alert("上传失败,请检查网络后重试");
//       } 
//    });
  
}  
  
document.getElementById('fileFolder').onchange = function(e) {  
    //判断是否选中文件  
      var file=$("#fileFolder").val();  
      if(file!=''){  
          $("#msg").text('');  
      }  
      var files = e.target.files; // FileList  
      //文件数量  
      actual_filesCount = files.length;  
      if(actual_filesCount > filesCount){  
         $("#msg").text("文件过多,单次最多可上传"+filesCount+"个文件");  
         return;  
      }  
      for (var i = 0, f; f = files[i]; ++i){  
          actual_filesSize += f.size;  
          if(actual_filesSize > filesSize){  
             $("#msg").text("单次文件夹上传不能超过"+filesSize/1024/1024+"M");  
             return;  
          }  
      }  
    };  
3、后端java:

  @RequestMapping(value="uploadFolder",method=RequestMethod.POST)  
	    @ResponseBody  
	    public String uploadFileFolder(HttpServletRequest request) {  
	    String Storage_PATH = request.getSession().getServletContext().getRealPath("blobform/imgs"); //文件存储位置
	      
		    MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);   
	        List<MultipartFile> files = params.getFiles("fileFolder");  
	   
	        BufferedOutputStream bos =null;  
            BufferedInputStream bis=null;  
            try {  
                //遍历文件夹  
                for (MultipartFile mf : files) {  
                    if(!mf.isEmpty()) {     //  byte[] content = mf.getBytes();    //文件内容                                                                               
                         String originalFilename = mf.getOriginalFilename();  
                        //格式限制,非jpg格式的不上传  
                        if(!"jpg".equals(originalFilename.substring(originalFilename.lastIndexOf(".")+1))) {  
                            continue;  
                        }  
                        String fileName=originalFilename.substring(originalFilename.lastIndexOf("/")+1);  
                        //为避免文件同名覆盖,给文件名加上时间戳  
                        int index = fileName.lastIndexOf(".");  
                        String firstName=fileName.substring(0, index);  
                        String lastName=fileName.substring(index);  
                        fileName=firstName+"_"+System.currentTimeMillis()+lastName;  
                        //读取文件  
                        bis=new BufferedInputStream (mf.getInputStream());  
                        //指定存储的路径  
                        bos=new BufferedOutputStream(new FileOutputStream(Storage_PATH+"/"+fileName));  
                        int len=0;  
                        byte[] buffer=new byte[10240];  
                        while((len=bis.read(buffer))!=-1){  
                            bos.write(buffer, 0, len);  
                        }  
                        //刷新此缓冲的输出流,保证数据全部都能写出  
                        bos.flush();  
                    }  
                }  
                bis.close();  
                bos.close();  
                return "ok";  
            } catch (FileNotFoundException e) {        
                e.printStackTrace();        
                return "error";        
            } catch (IOException e) {        
                e.printStackTrace();        
                return "error";            
            }  
	       
	    }  




  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值