背景介绍:公司要在CMS系统上为运营人员提供一个功能供运营人员将做好的活动页面上传到阿里云存储上,上传的内容为一个文件夹,文件夹内部有.html网页,JS文件夹下有JS文件,CSS文件夹下有样式表,Images文件夹下有多张图片,具体的目录接口如下;

要在网页上将整个文件夹进行上传,下面介绍下我整个实现的过程。

项目架构,前端使用的JSP,后端使用的Jersey,一个类似WebService的技术。

直接上代码,前端JSP文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="/Web/common/page/jqueryMaster_new.jsp"%>
<!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>文件夹上传</title>
</head>
<body>
<div id="content">
<h1>使用本功能时请使用谷歌浏览器</h1>
<div style="clear:both;content:'';"></div>
<br>
<br>
<u><font size="24">按照文件夹进行上传的功能只被个别浏览器支持,如谷歌,Microsoft Edge浏览器</font></u>
<div style="clear:both;content:'';"></div>
<br>
<br>
<form action="<%=url%>/v1/operation/uploadFolder" method="post" name="fileUploadForm" id="fileUploadForm" enctype="multipart/form-data">
<input name="fileFolder" type="file" webkitdirectory>
<input type="submit" name="subButton" value="提交">
</form>
</div>
</body>
</html>

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

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

后端代码也比较简单,但是必须注意的是,如果按照文件夹进行上传,后端就不能获取流,而是要获取整个表单。后端使用的是Jersey,想来使用其他技术应该也是一样的,只要能获取整个表单即可。

package com.bomei.services;

import java.io.InputStream;
import java.util.List; import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import org.apache.log4j.Logger;
import org.springframework.stereotype.Service; import com.bomei.util.Toolkit;
import com.bomei.util.UploadUtils;
import com.sun.jersey.core.header.FormDataContentDisposition;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart; /**
* 运营功能服务类
*
*/
@Path("/v1/operation")
@Service
public class OperationService { private Logger logger = Logger.getLogger(getClass()); @POST
@Path("/uploadFolder")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_HTML)
public String uploadFileFolder(
@Context HttpServletRequest request,
FormDataMultiPart fileUploadForm) { StringBuffer buffer = new StringBuffer().append("\n\n\n"); //初始化本次上传的文件夹名
String curUploadFolderName = "operation/"+String.valueOf(Toolkit.getCurrentTime());
System.out.println("本次上传创建的文件夹路径为:"+curUploadFolderName); List<FormDataBodyPart> filePartList = fileUploadForm.getFields("fileFolder");
if(null != filePartList){
for (FormDataBodyPart part : filePartList) {
InputStream inputStream = part.getValueAs(InputStream.class);
FormDataContentDisposition detail = part.getFormDataContentDisposition();
MediaType type = part.getMediaType();
String contentType = type.getType() + "/" + type.getSubtype(); String fileName = detail.getFileName();
//截取第一个/之后的路径地址
int indexOf = fileName.indexOf("/");
if(indexOf > 0){
fileName = curUploadFolderName + fileName.substring(indexOf);
}else{
fileName = curUploadFolderName + fileName;
} //开始上传操作
String path = UploadUtils.uploadFile(fileName, inputStream, contentType);//内部上传逻辑,你可以上传到你想要上传的任何位置 buffer.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
.append("文件名称&nbsp;&nbsp;").append(detail.getFileName().trim()).append("&nbsp;&nbsp;").append("文件路径&nbsp;&nbsp;").append(path).append("\n"); }
}else{
System.out.println("获取上传的文件夹内容失败,或者文件夹中不存在文件");
}
logger.info("运维上传的内容为:"+buffer.toString());
System.out.println("运维上传的内容为:"+buffer.toString());
return buffer.toString();
} }

具体的上传方法没有贴出来,你可以自己实现,或者百度,我内部是上传到了阿里云上。

至此整个文件夹上传操作就完成了,有两点需要注意的再次提一下:

1:并不是所有的浏览器都支持按照文件夹进行上传,需要添加必要的属性;

2:后端代码要获取的不是流对象,而是整个表单对象,这样才能遍历上传的文件夹。

Java上传文件夹(Jersey)的更多相关文章

  1. java上传文件夹文件

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  2. java+上传+文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素:   1.表单提交方式:post (get方式提交有 ...

  3. java上传文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用.此控件PC全平台支持包括mac,linux系统的文件上传,文章末尾将附上控件下载与教程链接 ...

  4. java+上传文件夹

    最近在学习百度的开源上传组件WebUploader,写了一些示例以记录.WebUploader的缺点是没有一个比较好的现成的界面,这个界面需要自己去实现.自由度高了一些. WebUploader是由B ...

  5. java实现上传文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  6. java+struts上传文件夹文件

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  7. java+实现上传文件夹

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  8. java 上传文件到FTP(centos中的ftp服务)

    ftp服务器系统:centos7 提供ftp的服务:vsftpd pom.xml 依赖 <dependency> <groupId>commons-net</groupI ...

  9. SFTP 上传文件夹

    使用sftp上传文件夹时若使用如下命令并不work: put /media/Research/GWAS_Class/* Desktop/ 此时,需要添加一个参数 -r, 另外在目标文件夹下面建立一个同 ...

随机推荐

  1. java 实验一

       步骤 耗时h 百分比% 需求分析 0.3h 7.5 设计 2.5h 62.5 代码实现 0.5h 12.5 测试 0,2h 5 分析总结 0.5h 12.5 实验一 截图 实验二: 实验三 实现 ...

  2. 【每日scrum】第一次冲刺day1

    冲刺第一天,明确了自己的任务,数据分析与数据字典.

  3. b5

    吴晓晖(组长) 过去两天完成了哪些任务 完善推荐算法 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还剩下哪些任务 组员:刘帅珍 过去两天完成了哪些任务: 修改原型,整理背景 明日计 ...

  4. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  5. 团队作业4 Alpha冲刺《嗨!你的快递》

    仓库地址:https://git.coding.net/day_light/ourexpressmaster1.git   张新宇 1第一天日期:2018/6/13 1.1今日任务 进行核心功能数据匹 ...

  6. 结队第二次作业——WordCount进阶需求

    结队第二次作业--WordCount进阶需求 博客地址 051601135 岳冠宇 博客地址 051604103 陈思孝 博客地址 Github地址 具体分工 队友实现了爬虫功能,我实现了wordco ...

  7. docker搭建redis未授权访问漏洞环境

    这是redis未授权访问漏洞环境,可以使用该环境练习重置/etc/passwd文件从而重置root密码 环境我已经搭好放在了docker hub 可以使用命令docker search ju5ton1 ...

  8. Genymotion-ARM-Translation_v1.1安装报“an error occured while deploying the file”

    如上图,在将Genymotion-ARM-Translation_v1.1.zip拖动Genymotion虚拟机中报了图中错误,在百度后找到了解决办法,下面是我的操作步骤 1.下载re管理器之类的ap ...

  9. 【高级】PHP-FPM和Nginx的通信机制

    PHP-FPM 介绍 CGI 协议与 FastCGI 协议 每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通 ...

  10. 半夜思考, Java 重载的实现

    因为最近在学 scala,看到了参数的默认值这个特性,但是Java好像没有这个特性, Java8 也没有, 所以特意去查了一下,就牵扯到了 C++了,[只怪 C++没怎么学,,]. 下面将一下为什么 ...