Spring MVC + Java 多文件上传及多文件中转上传
1.html内容
<div>
<form method="post" action="/Cyberspace/main/informationBatchAdd.do" enctype="multipart/form-data">
<input type="file" id="excelFile" multiple="multiple" name="file"/>
<button type="submit">批量上传</button>
</form>
</div>
2.服务端后台支持多文件上传的接口
/**
* 信息上报批量增加
*/
@RequestMapping(value = "informationBatchAdd", method = RequestMethod.POST)
@ResponseBody
public JSONResult informationBatchAdd(MultipartHttpServletRequest request) {
JSONResult jsonResult;
try {
Integer result = 0;
MultiValueMap<String, MultipartFile> multiValues = request.getMultiFileMap();//获取请求中所有的文件流
Iterator<Map.Entry<String, List<MultipartFile>>> iterator = multiValues.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, List<MultipartFile>> entry = iterator.next();
for (MultipartFile file : entry.getValue()) {
InputStream in = file.getInputStream();//转换成输入流
XSSFWorkbook readWb = new XSSFWorkbook(in);
for (int i = 0; i < readWb.getNumberOfSheets(); i++) {//遍历该表格中所有的工作表,i表示工作表的数量 getNumberOfSheets表示工作表的总数
XSSFSheet sheet = readWb.getSheetAt(i);
。。。
Integer totalRow = sheet.getLastRowNum();//获取excel共有多少行
for (int rowNum = 1; rowNum <= totalRow; rowNum++) { // 循环行Row
XSSFRow hssfRow = sheet.getRow(rowNum);
if (hssfRow != null && hssfRow.getPhysicalNumberOfCells() >= 7) {//getPhysicalNumberOfCells 获取纵列数
。。。
}
}
result += 。。。;
}
}
}
jsonResult = new JSONResult(CODE_SUCCESS, MSG_SUCCESS, result);//JSONResult是自己定义的一个类
} catch (Exception e) {
jsonResult = new JSONResult(CODE_FAIL, MSG_FAIL, null);
e.printStackTrace();
}
return jsonResult;
}
3.假如遇到要中转上传文件流到以上的接口中,那么下面的内容就是你的福音
/**
* 中转文件
*
* @param files 上传的文件,该参数的获取 request.getFiles("xxxx")或者参照第二步中的方法
* @return 响应结果
*/
public static String httpClientUploadFile(List<MultipartFile> files, String remoteUrl) {
final String remote_url = remoteUrl;// 第三方服务器请求地址
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
try {
HttpPost httpPost = new HttpPost(remote_url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);//设置浏览器兼容模式
for (int i = 0; i < files.size(); i++) {
MultipartFile file = files.get(i);
String fileName = file.getOriginalFilename();
builder.addBinaryBody("file" + i, file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流
builder.addTextBody("filename", fileName);// 类似浏览器表单提交,对应input的name和value
}
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
HttpEntity responseEntity = response.getEntity();
result = EntityUtils.toString(responseEntity, UTF8);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
4.中转下载文件
/*
接口:http://192.168.1.10:8080/GRSS/yw/api/fileDownload
-------请求参数----
path:upload/1505474431679.zip //文件路径 以upload/ 开头
filename: report.zip , //源文件名
------测试用例----
请求地址://http://localhost:8888/Cyberspace/main/fileDownload.do?filename=JSSDK中文.html
获取这个文件://url = "http://210.14.152.181:8188/examples/JSSDK.html";
*/
@RequestMapping(value = "fileDownload", method = RequestMethod.GET)
@ResponseBody
public String fileDownload(HttpServletRequest request, HttpServletResponse response) {
String url;
try {
String fileName = StringUtils.isNotEmpty(request.getParameter("filename")) ? request.getParameter("filename") : new Date().getTime() + "";
fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");//解决中文get方式乱码的问题url = "http://192.168.1.100:8188/examples/JSSDK.html";//我想下载这个JSSDK这个html文件
FileUtil.downloadFileFromNet(url, fileName, response);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/** FiletUtil.downloadFileFromNet
* 从网络中下载文件
*/
public static void downloadFileFromNet(String urlPath, String fileName, HttpServletResponse response) throws MalformedURLException {
InputStream fis = null;
OutputStream os = null;
try {
URL url = new URL(urlPath);
URLConnection urlConnection = url.openConnection();
// 以流的形式下载文件
fis = new BufferedInputStream(urlConnection.getInputStream());
// 设置响应报头
response.reset();
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, ENCODING));
response.setCharacterEncoding(ENCODING);
// 写入响应流数据
os = new BufferedOutputStream(response.getOutputStream());
byte[] bytes = new byte[1024];
while (fis.read(bytes) != -1) {
os.write(bytes);
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Spring MVC + Java 多文件上传及多文件中转上传的更多相关文章
- Spring MVC 学习总结(五)——校验与文件上传
Spring MVC不仅是在架构上改变了项目,使代码变得可复用.可维护与可扩展,其实在功能上也加强了不少. 验证与文件上传是许多项目中不可缺少的一部分.在项目中验证非常重要,首先是安全性考虑,如防止注 ...
- Spring MVC 搭建过程中web.xml配置引入文件的路径问题
为啥要说一下这么low的问题,因为我是一个比较low的人,哈哈.本来我技术有限,没事干自己撘个环境找找乐趣,结果被各种基础问题,弄的一脸蒙蔽.算了不多说,直接说问题. 1.首先说一下java编译后的文 ...
- 在Spring MVC项目中,注解方式使用 .properties 文件及 UTF-8编码问题
xml配置 <!-- 配置文件 --> <bean id="configProperties" class="org.springframework.b ...
- spring mvc学习笔记(一)web.xml文件配置的一点重要信息
通过这个web.xml文件可以看出,所有的*.shtml的请求,都会被springmvc这个servlet处理.这里如果没有指定contextConfigLocation这个参数,将会按照默认规则在c ...
- Spring MVC (Java),强制页面不缓存
response.setDateHeader("Expires",0); response.setHeader("Buffer","Tr ...
- Spring MVC-学习笔记(5)spring MVC的文件上传、下载、拦截器
1.文件上传. spring MVC为文件上传提供了直接的支持,这种支持是即插即用的MultipartResolver(多部分解析器)实现的.spring MVC使用Apache Commo ...
- 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能
Ajax文件上载 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能: 步骤 导入组件并准备静态脚本 <dependency> <groupId& ...
- 深入理解java:4.1. 框架编程之Spring MVC
说到java的mvc框架,struts2和springmvc想必大家都知道, Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高 ...
- 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先
毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...
随机推荐
- Pandas 通过追加方式合并多个csv
常用合并 通常用pandas进行数据拼接.合并的方法有: pandas.merge() pandas.concat() pandas.append() 还有一种方式就是通过 pd.to_csv() 中 ...
- Pandas 如何去除、取消已经设置好的索引
Outline 今天处理数据时遇到一个问题: 因为业务需要,我对 df 进行了建立索引. 具体如下: 下面走的是默认索引 给其设置索引: 取消索引 业务需求,我要取消掉上面设置的索引: So,之前设置 ...
- 列表(List) 的增删改查及其他方法
一.列表的简介 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...
- Python3+Selenium3自动化测试-(五)
这里来说一说selenium中的等待方式,其实在webdriver只有两种类型等待方式,显式等待和隐式等待,之前是在程序运行过程中使用time模块中的sleep进行代码的休眠进行强制等待,是显式等待中 ...
- 系列文章(二):从WLAN的安全威胁,解析电信诈骗的技术症结——By Me
导读:互联网的无线接入已经成为大趋势,其中无线局域网(又称为WLAN,Wireless Local AreaNetwork)以其使用方便.组网灵活.可扩展性好.成本低等优点,成为互联网特别是移动互联网 ...
- 2 TensorFlow入门笔记之建造神经网络并将结果可视化
------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...
- Linq To Object多字段组合唯一校验
1.第一种方式 if(partsSalesOrderTypes.GroupBy(entity => new { entity.Name, entity.Code }).Any(array =&g ...
- Git 快速入门--Git 基础
Git 快速入门 Git 基础 那么,简单地说,Git 究竟是怎样的一个系统呢? 请注意接下来的内容非常重要,若你理解了 Git 的思想和基本工作原理,用起来就会知其所以然,游刃有余. 在开始学习 G ...
- 正则表达式和python的re模块
0 正则表达式 0.1 常见的元字符 .: 匹配除\r\n之外的任何单个字符 *: 匹配前面的子表达式任意次,例如Zz*可以匹配Z,可以匹配Zz,也可以匹配Zzzzzzzzzz +: ...
- 负载均衡集群ipvsadm命令及基本用法
ipvsadm是LVS在应用层的管理命令,我们可以通过这个命令去管理LVS的配置.需要使用yum单独安装. 基本用法: ipvsadm COMMAND [protocol] service-addre ...