这里我们介绍文件上传的知识,使用的是apache的Commons FileUpload框架。

文件上传的使用

项目的部分结构如下:

一、使用Commons FileUpload的上传功能,我们需要引入两个jar包:commons-fileupload和commons-io。首先我们列出html的部分

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>huhx1.html</title>
</head>
<body>
<form method="POST" enctype="multipart/form-data" action="FileUploadServlet">
File to upload1: <input type="file" name="upfile1"><br/>
File to upload2: <input type="file" name="upfile2"><br/>
Notes about the file: <input type="text" name="note"><br/>
<br/>
<input type="submit" value="Press"> to upload the file!
</form>
</body>
</html>

二、 FileUploadServlet是一个servlet,内容如下:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository); ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
System.out.println("name: " + name + ", value: " + value);
} else {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
File uploadedFile = new File(request.getServletContext().getRealPath("file"), fileName);
System.out.println(uploadedFile.getAbsolutePath());
item.write(uploadedFile);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

这里需要在部署项目的目录下面创建file文件夹,如下图。request.getServletContext().getRealPath("file")代码

spring mvc上传文件

一、在配置文件中配置上传的信息

<!-- 支持上传文件 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="5000000" />
</bean>

CommonsMultipartResolver其实就是对上述的common-fileupload的一种封装。

二、在java类中: 多文件上传需要@RequestParam(value="files"),files表示定义file的name。对于formData,那就是文件的key。

public void fileUplaod(HttpServletRequest request, @RequestParam(value="files") MultipartFile[] files, HttpServletResponse response) {
System.out.println(files.length);
ResponseResult result = new ResponseResult();
for (MultipartFile file : files) {try {
FileUtils.copyInputStreamToFile(file.getInputStream(), new File(realPath, file.getOriginalFilename()));
} catch (IOException e1) {
e1.printStackTrace();
}
}
Map<String, String> map = new HashMap<>();
result.setReturnCode(Constants.SUCCESS_RETURN_CODE);
result.setData(map);
ResponseUtils.returnResponseJsonData(response, result);
}

三、为防止文件重复提交,需要比较文件的信息

String newFileContent = file.getOriginalFilename() + file.getSize();
String newEncryFile = EncryptUtils.sha1Encrypt(newFileContent); // 在实际使用中,request.getSession().getAttribute("fileCheck")是从数据库中得到的
if (newEncryFile.equals(request.getSession().getAttribute("fileCheck"))) {
result.setReturnCode(Constants.FAIL_RETURN_CODE);
result.setErrorMsg(ConstantsMsg.FILE_UPLOAD_REPEAT);
ResponseUtils.returnResponseJsonData(response, result);
return;
} // ....上传完成之后,encryFile会存在数据库当中
String fileContent = file.getOriginalFilename() + file.getSize();
String encryFile = EncryptUtils.sha1Encrypt(fileContent);
request.getSession().setAttribute("fileCheck", encryFile);

FileUpload的原理

后续补充

友情链接

最新文章

  1. ABAP单元测试最佳实践
  2. date命令
  3. s验证数据库中字段值是否重复
  4. 基于Oracle的Mybatis 批量插入
  5. mysql 数据库字符集的指定
  6. html添加网络音乐
  7. $key 的用法
  8. Photoshop图层混合模式计算公式大全(转)
  9. 【BZOJ】【2733】【HNOI2012】永无乡
  10. 【不积跬步,无以致千里】DELETE SINGLE IPTABLES RULES
  11. etrace 跟踪 nginx之HTTP请求流程
  12. Delphi图像处理 -- 最大值
  13. postgis常用操作手册
  14. 五十个小技巧提高PHP执行效率(二)
  15. springmvc 访问时找不到配置文件
  16. Python基础之集合
  17. HDU 1098(条件满足 数学)
  18. odoo学习之弹框显示
  19. MySQL 基础 备份和恢复
  20. 如何去掉IE文本框后的那个X css代码

热门文章

  1. SpringBoot配置成Liunx服务
  2. JavaScript 闭包原理分析
  3. 关于BETA、RC、ALPHA、Release、GA等版本号的意义
  4. CSS(一):CSS简介和基本语法
  5. 无法登录 MySQL 服务器 mysqli_real_connect() (HY000 2002) No such file or directory
  6. 〖wordpress实用小技巧〗添加几个字符实现子目录访问转移到域名直接访问
  7. Qt学习之路(tip): parent参数
  8. 关于ARM中的tst、cmp、bne、beq指令
  9. 【转】【Linux】Linux 命令行快捷键
  10. Android ArryaList 笔记