本文主要关于利用html表单上传文件的后台代码实现。
需要用到两个工具类Apache commons-fileupload和commons-io。
注意要校验是否选择文件上传,最开始写的时候没有加上校验,没有选择文件,提交表单后一直报异常。
当然也可以在前台加上js判断是否选择文件
前台页面代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
 
<form action="${pageContext.request.contextPath }/UploadServlet" method="post" enctype="multipart/form-data">
<input type="text" name="username">
<input type="file" name="upload">
<input type="submit" value="提交">
</form>
 
 
</body>
</html>
后台Java Servlet代码
 
package demo;
 
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
 
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
 
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
 
 
public class UploadServlet extends HttpServlet {
 
 
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//1、创建磁盘文件项工厂
//获取web根目录下放置缓存文件的文件夹“temp”的物理路径
String path_temp = this.getServletContext().getRealPath("temp");
File file =  new File(path_temp) ;
DiskFileItemFactory factory = new DiskFileItemFactory(1024*1024, file);//1024*1024为设置文件缓存大小
//也可以new一个空参的factory,随后再设置缓存大小,和缓存位置
//DiskFileItemFactory factory = new DiskFileItemFactory();
//factory.setSizeThreshold(1024*1024);
//factory.setRepository(file);
//2、创建文件上传的核心类
ServletFileUpload upload = new ServletFileUpload(factory);
//设置上传文件名称的编码为UTF-8,不设置有可能会出现中文乱码,编码规范要进行设置。
upload.setHeaderEncoding("UTF-8");
//判断表单是否是文件上传表单,只是为了演示需要,实际开发中开发人员肯定知道这是不是文件上传表单
boolean multipartContent = upload.isMultipartContent(request);
if(multipartContent) {
//是文件上传的表单,解析request获得文件项集合
List<FileItem> parseRequest = upload.parseRequest(request);
if(parseRequest!=null) {
for(FileItem item :parseRequest) {
//判断是不是普通表单项
boolean formField = item.isFormField();
if(formField) {
//如果是普通表单项
String fieldName = item.getFieldName();
String fieldValue = item.getString("UTF-8");//对普通表单项的内容进行编码
//当表单是enctype="multipart/form-data"时,request.getParameter相关的方法都失效,所以要用上面的方法获得值
//String parameter = request.getParameter("username");//获取不到,失效!
System.out.println("表单值为:"+fieldName+"="+fieldValue);
}else {
//如果是文件上传项
String name = item.getName();
System.out.println("文件名为:"+name);
System.out.println(item);
//加入判断文件是否上传,如果不加判断,前台没有选择文件,提交后会报IO空指针异常
if(item.getSize()==0L) {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("请上传文件");
return;
}
if(name=="") {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("文件名不能为空");
return;
}
InputStream in = item.getInputStream();
String path_store = this.getServletContext().getRealPath("upload");
OutputStream out = new FileOutputStream(path_store+"/"+name);
IOUtils.copy(in, out);
in.close();
out.close();
//删除临时文件
item.delete();
}
}
}
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("是文件上传");
}else {
//不是文件上传表单,可以使用原始的获取表单数据方式request.getParameter();
//只是为了演示需要,实际开发中开发人员肯定知道这是不是文件上传表单
Map<String, String[]> parameterMap = request.getParameterMap();
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("不是文件上传表单");
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
 
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
版权声明:本文为CSDN博主「WenJie1024」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/javae100/article/details/79938923

最新文章

  1. 用C#开发ActiveX控件,并使用web调用
  2. flash 居中问题
  3. iar 问题
  4. CBOW Model Formula Deduction
  5. C#中把Datatable转换为Json的5个代码实例
  6. 【poj2546】 Circular Area
  7. Redis persistence demystified - part 2
  8. SAS使用SPD引擎并报Encoding错误
  9. EntityFramework优缺点(转)
  10. jQuery滚动监听插件Waypoints
  11. JavaScript中样式,方法 函数的应用
  12. Maven中心仓库
  13. Substring的简单使用
  14. Json帮助类以及如何使用
  15. javascritp第十课:面向对象
  16. linux命令每日一练:find与rm实现查找并删除目录或文件
  17. 挑子学习笔记:DBSCAN算法的python实现
  18. 【C++】GSL(GNU Scientific Library) 的安装及在 Visual Studio 2017 中的使用
  19. 【HNOI2018】毒瘤
  20. Linux 系统安全设置

热门文章

  1. Nginx系列1.1:ubuntu16.04编译nginx-rtmp流媒体服务器
  2. MOOC课程信息D3.js动态可视化
  3. ubuntu---记录. opencv3.4.7
  4. 解决CentOS虚拟机开机黑屏卡死问题
  5. react-router和react-router-dom的区别
  6. Entity Framework二、 模型优先 ,ObjectContext类
  7. [唐胡璐]Selenium技巧- 如何处理Table
  8. 学习Python编程的最好的几本书
  9. [Functional Programming] liftA2 and converge
  10. EF非常见错误:EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配