文件上传的方法主要目前有两个常用的:
一个是SmartUpload;
一个是Apache的Commons fileupload。
我这里主要学习第二个的用法,首先要上传文件,注意几个问题:
1 form表单内,要添加:<input type="file" name="myfile"> ;
2 form表单的内容格式要定义成multipart/form-data格式,即添加属性enctype = "multipart/form-data" ;
3 需要类库:commons-io.jar 和 commons-fileupload-1.3.1.jar 。
主要步骤描述:
在webRoot下新建了upload文件夹,当部署项目后会随项目一起部署到服务器上;
新写一个UploadServlet,上传的文件会保存到upload文件夹中,当项目从服务器上移除时,该文件夹会自动清除。
前端(upload.html)代码:
<body>
<form action="/login/UploadServlet" method="post" enctype="multipart/form-data">
请选择上传的图片或文件:
<input type="file" name="good_pcl" id="good_pcl"><br/><br/>
<input type="submit" value="上传" />
</form>
</body>
UploadServlet.java代码:
/*编码*/
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 为解析类提供配置信息
DiskFileItemFactory factory = new DiskFileItemFactory();
// 创建解析类的实例
ServletFileUpload sfu = new ServletFileUpload(factory);
// 开始解析,解析实例空间大小的设置
sfu.setFileSizeMax(1024 * 400);
// 每个表单域中数据会封装到一个对应的FileItem对象上
try {
List<FileItem> items = sfu.parseRequest(request);
// 区分表单域
for (int i = 0; i < items.size(); i++) {
FileItem item = items.get(i);
// isFormField为true,表示这不是文件上传表单域
if (!item.isFormField()) {
ServletContext sctx = getServletContext();
// 获得存放文件的物理路径
// upload下的某个文件夹 得到当前在线的用户 找到对应的文件夹
String path = sctx.getRealPath("/upload");
System.out.println(path);
// 获得文件名
String fileName = item.getName();
System.out.println(fileName);
// 该方法在某些平台(操作系统),会返回路径+文件名
fileName = fileName
.substring(fileName.lastIndexOf("/") + 1);
File file = new File(path + "\\" + fileName);
if (!file.exists()) {
item.write(file);
// 将上传图片的名字记录到数据库中
response.sendRedirect("/login/upload/ok.html");
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
上传图片和文件属于 enctype = "multipart/form-data"(enctype 是form的一个属性)
form中加入enctype="multipart/form-data" 时整个表单被封装,字符串将转成二进制流,因此request.getParameter("XXX")是得不到的。
默认情况,传递参数编码格式是application/x-www-form-urlencoded,不能用于图片文件上传,只用使用multipart/form-data,才能完整的传递文件数据。