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 多文件上传及多文件中转上传的更多相关文章

  1. Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC不仅是在架构上改变了项目,使代码变得可复用.可维护与可扩展,其实在功能上也加强了不少. 验证与文件上传是许多项目中不可缺少的一部分.在项目中验证非常重要,首先是安全性考虑,如防止注 ...

  2. Spring MVC 搭建过程中web.xml配置引入文件的路径问题

    为啥要说一下这么low的问题,因为我是一个比较low的人,哈哈.本来我技术有限,没事干自己撘个环境找找乐趣,结果被各种基础问题,弄的一脸蒙蔽.算了不多说,直接说问题. 1.首先说一下java编译后的文 ...

  3. 在Spring MVC项目中,注解方式使用 .properties 文件及 UTF-8编码问题

    xml配置 <!-- 配置文件 --> <bean id="configProperties" class="org.springframework.b ...

  4. spring mvc学习笔记(一)web.xml文件配置的一点重要信息

    通过这个web.xml文件可以看出,所有的*.shtml的请求,都会被springmvc这个servlet处理.这里如果没有指定contextConfigLocation这个参数,将会按照默认规则在c ...

  5. Spring MVC (Java),强制页面不缓存

    response.setDateHeader("Expires",0);        response.setHeader("Buffer","Tr ...

  6. Spring MVC-学习笔记(5)spring MVC的文件上传、下载、拦截器

    1.文件上传.      spring MVC为文件上传提供了直接的支持,这种支持是即插即用的MultipartResolver(多部分解析器)实现的.spring MVC使用Apache Commo ...

  7. 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能

    Ajax文件上载 利用 FormData 对象和 Spring MVC 配合可以实现Ajax文件上载功能: 步骤 导入组件并准备静态脚本 <dependency> <groupId& ...

  8. 深入理解java:4.1. 框架编程之Spring MVC

    说到java的mvc框架,struts2和springmvc想必大家都知道, Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高 ...

  9. 五大 JAVA Web 框架的优缺点对比,Spring MVC 领先

    毫无疑问,Java 是当今世界上最重要的编程语言之一.js 框架给程序员提供了 一个可以构建程序的坚实基础.它包括定义的类和功能,用于硬件设备管理,与系统软件交互并处理输入,让开发人员变得更轻松.Ja ...

随机推荐

  1. DjangoDRF序列化组件使用

    创建一个Django项目,名字:untitled1 创建三张表 from django.db import models class Publish(models.Model): nid = mode ...

  2. shell脚本调用传参【转载】

    转自:https://www.cnblogs.com/cisum/p/8010658.html 1.直接使用$0,$1,$2,$3 $0是脚本的名字,就是按顺序来 #!/bin/bash # auth ...

  3. python16_day06【类、RE模块、subprocess模块、xml模块、shelve模块】

    一.shelve模块 import shelve # 基于pickle模块, d = shelve.open('shelve_test') class Test(object): def __init ...

  4. PL/SQL编程—变量

    SQL> declare c_tax_rate ,):=0.03; v_name ); v_passwd ); v_sale ,); v_tax_sale ,); begin select na ...

  5. HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)

    题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...

  6. Java 基础总结(二)

    本文参见:http://www.cnblogs.com/dolphin0520/category/361055.html 1. 字节流与和字符流 1). 字符流操作时使用了缓冲区,而在关闭字符流时会强 ...

  7. mybatis入门学习记录(一)

    过硬的技术本领,可以给我们保驾护航,飞得更高.今天开始呢.我们就一起来探讨使用mybatis的好处. 首先我们一起来先看看原生的JDBC对于数据库的操作,然后总结其中的利弊,为学习mybatis奠定基 ...

  8. VMWare 安装时报错 tools-windows.msi failed报错解决办法

    1.我用的是7.1.3版本的,到官方网站上下载这个版本的tools安装包 http://softwareupdate.vmware.com/cds/vmw-desktop/ws/7.1.3/32428 ...

  9. Tomcat 线程池配置

    线程池 Executor代表了一个线程池,可以在Tomcat组件之间共享.使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率.要想使用线程池,首先需要在 Service标签中 ...

  10. 介绍Web项目中用到的几款表单验证插件

    第一个插件 jqueryvalidation 官网地址:http://jqueryvalidation.org/ 第二个插件 nice Validator 官网地址: http://niceue.co ...