首页 > 编程语言 >java web 上传文件夹的实现(支持Chrome)

java web 上传文件夹的实现(支持Chrome)

时间:2023-11-06 09:55:37浏览次数:43  
标签:web java 文件 Chrome fileName map 文件夹 file 上传

上传文件夹的思路其实就是将文件夹中所有的文件上传到服务器,上传的时候文件名称要从文件夹目录开始截取,以下图中的目录为例,index.html文件应该以news_1/index.html的路径传到服务器,所有文件上传之后,上传到服务器的文件夹路径是从上传的上传的文件路径截取到文件夹结束。下面详细介绍:

Chrome的实现可以通过input标签的webkitdirectory就可以很容易的实现,但是由于ie浏览器不支持input标签的webkitdirectory属性,所以IE浏览器下可以直接通过ActiveX来直接访问和操作本地文件。实现可查看java web 上传文件夹的实现(支持IE)文章,下面介绍Chrome的实现方法:

假设我需要上传的文件夹目录如下,下面的例子会已这个文件夹路径为参考:

 

 

1.Chrome实现上传文件夹:

(1)type=‘file’的input标签是传统上传文件的实现方式,在这里只需要加上webkitdirectory属性,就可以选择文件夹了:

<form method="POST" enctype=multipart/form-data>
<input type="text" name="JUMP_LINK" id="JUMP_LINK" readonly="readonly" value="" title="文件夹" />
<input type='file' name="folder" id="folder" onchange="uploadFolder();" webkitdirectory>
</form>

需要注意2点,1.form表单要用POST提交;2.至于enctype=multipart/form-data属性,本人加了之后发现对同一个表单的上传文件会有影响,去了之后发现并不影响,所以可以默认不要,有问题的时候再加;

(2)js部分如下,通过FormData类保存文件夹中的所有文件

<script>
//上传文件夹
function uploadFolder(){
var formData = new FormData();
if($("#folder")[0].files.length>0){
for(var i=0;i<$("#folder")[0].files.length;i++){
formData.append('file_'+i, $("#folder")[0].files[i]);//此处的第一个参数不能重复,否则会覆盖
}
}
$.ajax({
url: '<%=basePath%>graphicInformation/uploadFolder.do',
type: 'POST',
cache: false,
data: formData,
dataType:"json",
processData: false,
contentType: false,
success:function(data){
if(data.state == "success"){
$("#JUMP_LINK").val(data.folder_url);//将上传之后的路径存到id为JUMP_LINK的标签里
alert("文件夹上传成功");
}else{
alert.msg(data.state);
}
}
});
}
</script>

(3)java后台实现的思想是,在循环上传文件的时候,在第一次截取文件夹的名称,也就下文中的folderRoot变量,执行时folderRoot的值应该“news_1/”,fileName的值为"news_1/index.html",其他类似,然后将fileName作为文件名上传到服务器。fileRelativePath 变量是自己加的上传服务器的前缀路径,大家可以根据自己的情况决定。实现如下:

/**
* 上传文件夹
*
* @return
* @throws IOException
*/
@RequestMapping(value = "/graphicInformation/uploadFolder")
@ResponseBody
public Map<String,String> uploadFolder(HttpServletRequest request)
throws Exception {
Map<String,String> map = new HashMap<String, String>();
// 文件上传开始
// 创建一个通用的多部分解析器
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
String folderRoot = "";
String fileRelativePath = Const.DDJD_NEWS_FOLDER+new SimpleDateFormat("yyyyMM").format(new Date())+ "/" ;
// 判断 request 是否有文件上传,即多部分请求
if (multipartResolver.isMultipart(request)) {
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
// 取得request中的所有文件名
Iterator<String> iter = multiRequest.getFileNames();
while (iter.hasNext()) {
// 取得上传文件
MultipartFile file = multiRequest.getFile(iter.next());
CommonsMultipartFile cf= (CommonsMultipartFile)file;
DiskFileItem fi = (DiskFileItem)cf.getFileItem();
// 取得当前上传文件的相对路径
String fileName = fi.getName();
if("".equals(folderRoot) && fileName.indexOf("/") !=-1){
folderRoot = fileName.substring(0, fileName.indexOf("/"))+"/";
}
if (file != null) {
String myFileName = file.getOriginalFilename();
// 如果名称不为“”,说明该文件存在,否则说明该文件不存在
if (myFileName.trim() != "") {
// 上传文件
Map<String,String> uploadResult = OSSClientUtil.uploadFile2OSS(file.getInputStream(), fileName,Const.DDJD_NEWS_CODE,2);
if (Tools.isEmpty(uploadResult.get("ret"))) {
map.put("state", "上传失败");
return map;
}
// 把路径返回出去
System.out.println(ALI_OSS_PRIFIX + fileRelativePath+ fileName);
// 把相对路径返回出去
}
}
}
}
map.put("folder_url",ALI_OSS_PRIFIX + fileRelativePath+folderRoot+"index.html");
map.put("state", "success");
// 文件上传结束
return map;
}

 

参考文章:http://blog.ncmem.com/wordpress/2023/11/05/java-web-%e4%b8%8a%e4%bc%a0%e6%96%87%e4%bb%b6%e5%a4%b9%e7%9a%84%e5%ae%9e%e7%8e%b0%ef%bc%88%e6%94%af%e6%8c%81chrome%ef%bc%89/

欢迎入群一起讨论

 

 

标签:web,java,文件,Chrome,fileName,map,文件夹,file,上传
From: https://www.cnblogs.com/songsu/p/17811881.html

相关文章

  • 关于 JavaScript 模块化的描述
    AMD是RequireJS在推广过程中对模块定义的规范化产出,而CMD是SeaJS在推广过程中对模块定义的规范化产出,也就是,RequireJS遵循AMD规范,而Sea.js遵循CMD规范eaJs遵循CMD规范为通用模块规范,RequireJs遵循AMD规范为异步模块规范。CMD依赖就近,AMD依赖前置。//CMDCommonModuleD......
  • Javascript中表达式 "2"+3+4 的值为 "234"
    是左关联,表达式相当于("2"+3)+4根据ES5规范11,6,1节,如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作。数字+字符串=>(数字).toString()+字符串如:1+'2'=12数字-字符串=>数字-Number(字符串)如:1-'2'=-1+是左连接......
  • 206-java修改图片文件的元属性值TIFF_TAG_SOFTWARE等
    base64的图片转为文件//base64的图片转为文件Stringbase64String=obj.getString("base64");byte[]imageBytes=java.util.Base64.getDecoder().decode(base64String);FileoutputFile=null;FiletmpPathDir=newFile(tmpPath);tmpPathDir.mkdirs();StringfileP......
  • Java基础知识回顾1-面向对象
    一、Java特性1.面向对象众所周知,Java是一个面向对象的语言,万物皆对象。面向对象基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。程序就是由无数个对象和......
  • wasm-vips libvips webassembly 实现
    wasm-vips是利用了emscripten将libvips编译为webassembly可以实现在node以及浏览器中使用libvips强大的图片处理处理以下是一个简单的试用参考试用app.js constVips=require('wasm-vips'); asyncfunctioninit(){constvips=awaitVips......
  • Java学习—循环语句
    1、if...else语句Java中的条件语句允许程序根据条件的不同执行不同的代码块。一个if语句包含一个布尔表达式和一条或多条语句。if语句用于测试条件。它检查布尔条件为:true或false。如果布尔表达式的值为true,则执行if语句中的代码块,否则执行else语句块后面的代码。java中有......
  • Java 基础篇day07
    面向对象三大特征之二继承权限修饰符掌握四种权限修饰符的特点和作用修饰作用范围private只能在本类中访问,其他地方不能访问缺省(包访问权限):只能在本类中或者同一个包下的其他类中protect:在本类中,同一包下的其他类中,其他包下的子孙类中(在其他包中的子类中,即要继承的类,子......
  • 在JavaScript中生成随机字符串/字符
    内容来自DOChttps://q.houxu6.top/?s=在JavaScript中生成随机字符串/字符我想要一个由随机从集合[a-zA-Z0-9]中选取的字符组成的5个字符的字符串。在JavaScript中实现这个功能的最佳方法是什么?我认为这个代码可以满足你的需求:functionmakeid(length){letresult=......
  • 请使用JavaScript比较两个日期的代码
    内容来自DOChttps://q.houxu6.top/?s=请使用JavaScript比较两个日期的代码有人能提供一种使用JavaScript比较两个日期值大于、小于和不在过去的方法吗?这些值将来自文本框。使用JavaScript比较两个日期值大于、小于和不在过去的方法如下:使用Date对象,可以为每个日期构造一个......
  • Java系列:Java8 新特性:强大的 Stream API(创建 Stream、中间操作、终止操作)
    Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个则是StreamAPI。StreamAPI(java.util.stream)把真正的函数式编程风格引入到Java中。这是目前为止对Java类库最好的补充,因为StreamAPI可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。......