前端jsp,后台Java。具体步骤如下
1.jsp代码如下,主要设置两个属性,给form表单设置这个属性enctype="multipart/form-data";给input=file设置multiple="multiple"属性,多文件上传,如果不写这个属性,只能单个上传。
<form method="post" action="photoTestBLH_saveImportData.do" class="pageForm required-validate" enctype="multipart/form-data" type='ewForm' size="{th:'25%'}" >
<div class="pageFormContent" layoutH="0">
<div class="ew-c-globalForm-content">
<div style="margin-top:20px;padding:10px 0px 10px 0px;">
<table class="ew-c-formTbl">
<colgroup>
<col style="width: 20%" />
<col style="width: 80%" />
</colgroup>
<tbody>
<tr>
</tr>
<tr>
</tr>
<tr>
<th align="right" style="width:20%;">文件</th>
<td style="width:80%;">
<input type="file" name="importExcel" id="importExcel" multiple="multiple"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<input type="submit" caption="导入" >
<input class="close" type="button" caption="关闭" value="关闭">
</div>
</form>
样式是这样的:
2.后台处理代码:保存文件到指定路径下。
public IZrarResponse saveImportData(IZrarRequest req) throws Exception{
IZrarResponse res = new ZrarResponse();
String savePath = "D:\\";
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
// 解决上传文件名的中文乱码
fileUpload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是上传表单的数据
if (!fileUpload.isMultipartContent(req.getHttpServletRequest())) {
// 按照传统方式获取数据
return null;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> fileItems = fileUpload.parseRequest(req.getHttpServletRequest());
//赋值
for (FileItem item : fileItems) {
//附件表主键
String md5Id = (new StringBuilder(String.valueOf(System.currentTimeMillis()))).toString();
// 如果fileitem中封装的是上传文件,得到上传的文件名称,
String fileName = item.getName();
System.out.println(fileName);
if (fileName == null || fileName.trim().equals("")) {
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
// 获取item中的上传文件的输入流
InputStream inputStream = item.getInputStream();
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath + "\\" + fileName);
//创建一个缓冲区
byte buffer[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=inputStream.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
out.write(buffer, 0, len);
}
//关闭输入流
inputStream.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
item.delete();
}
return res;
}
完毕!!
3.如果form表单里面既有file类型,又有其他数据类型,可以这样写:
jsp:
<form method="post" action="photoTestBLH_saveImportData.do" class="pageForm required-validate" enctype="multipart/form-data" type='ewForm' size="{th:'25%'}" >
<div class="pageFormContent" layoutH="0">
<div class="ew-c-globalForm-content">
<div style="margin-top:20px;padding:10px 0px 10px 0px;">
<table class="ew-c-formTbl">
<colgroup>
<col style="width: 20%" />
<col style="width: 80%" />
</colgroup>
<tbody>
<tr>
<th align="right" style="width:20%;">testName</th>
<td style="width:80%;">
<input type="input" name="name" />
</td>
</tr>
<tr>
<th align="right" style="width:20%;">testPlace</th>
<td style="width:80%;">
<input type="input" name="imgClassName" />
</td>
</tr>
<tr>
<th align="right" style="width:20%;">文件</th>
<td style="width:80%;">
<input type="file" name="importExcel" id="importExcel" multiple="multiple"/>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<input type="submit" caption="导入" >
<input class="close" type="button" caption="关闭" value="关闭">
</div>
</form>
java:
public IZrarResponse saveImportData(IZrarRequest req) throws Exception{
IZrarResponse res = new ZrarResponse();
String savePath = (new StringBuilder(String.valueOf(this.UPLOAD_DIR_LINUX)))+"";//+File.separator
String newDate = DateUtil.dateToString(1, new Date());
// savePath = "D:\\";
// 使用Apache文件上传组件处理文件上传步骤:
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
// 解决上传文件名的中文乱码
fileUpload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是上传表单的数据
if (!fileUpload.isMultipartContent(req.getHttpServletRequest())) {
// 按照传统方式获取数据
return null;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> fileItems = fileUpload.parseRequest(req.getHttpServletRequest());
//赋值
for (FileItem item : fileItems) {
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
// 解决普通输入项的数据的中文乱码问题
String value = item.getString("UTF-8");
System.out.println(name + " " + value);
//jsp 页面的name属性
if("place".equals(name)){
System.out.println(value);
}
if("imgClassName".equals(name)){
System.out.println(value);
}
}else {
//附件表主键
String md5Id = (new StringBuilder(String.valueOf(System.currentTimeMillis()))).toString();
// 如果fileitem中封装的是上传文件,得到上传的文件名称,
String fileName = item.getName();
System.out.println(fileName);
if (fileName == null || fileName.trim().equals("")) {
continue;
}
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如:
// c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
// 获取item中的上传文件的输入流
InputStream inputStream = item.getInputStream();
String mobilePhone = fileName.substring(0,fileName.lastIndexOf("."));
String sql = "UPDATE t_xt_yh set photo_src = '"+ savePath + "\\" + fileName +"' where usermobile = '"+mobilePhone+"' ";
dao.update(sql);
//创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath + "\\" + fileName);
//创建一个缓冲区
byte buffer[] = new byte[1024];
//判断输入流中的数据是否已经读完的标识
int len = 0;
//循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while((len=inputStream.read(buffer))>0){
//使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
out.write(buffer, 0, len);
}
//关闭输入流
inputStream.close();
//关闭输出流
out.close();
//删除处理文件上传时生成的临时文件
item.delete();
}
}
return res;
}