Servlet 文件上传

目录:

一、客户端


      Web文件上传采用POST的方式。需要设置FORM表单元素的enctype属性为multipart/form-data由于上传

的文件会比较大,因此需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype属性默认application/x-

www.form-urlencoded,浏览器将使用ASCII向服务器发送数据,导致发送文件失败。


表单代码如下:

<form action="upload" method="post" enctype="multipart/form-data">
	<fieldset  >
		<legend>上传文件</legend>
		<div class="line">
			<div align="left" class="leftDiv">上传文件一</div>
			<div align="left" class="rightDiv">
				<input type="file" name="file1" class="text" />
			</div>
		</div>
		<div class="line">
			<div align="left" class="leftDiv">上传文件说明一</div>
			<div align="left" class="rightDiv">
				<input type="text" name="description1" class="text" />
			</div>
		</div>
		<div class="line">
			<div align="left" class="leftDiv">上传文件二</div>
			<div align="left" class="rightDiv">
				<input type="file" name="file2" class="text">
			</div>
		</div>
		<div class="line">
			<div align="left" class="leftDiv">上传文件说明二</div>
			<div align="left" class="rightDiv">
				<input type="text" name="description1" class="text" />
			</div>
		</div>
		<div class="line">
			<div align="left" class="leftDiv"></div>
			<div align="left" class="rightDiv"></div>
			<input type="submit" value="上传文件" class="button" />
		</div>
	</fieldset>
</form>

二、服务端


所需jar包

commons-io-1.3.2.jar

commons-fileupload-1.2.1.jar

servlet代码:

public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 2453046781184529949L;
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	File file1 = null;
	File file2 = null;
	String description1 = null;
	String description2 = null;
	// 对request进行封装
	RequestContext requestContext = new ServletRequestContext(request);
	// 判断表单是否是multipart类型的。这里可以直接对request进行判断,不过已经是以前的用法了
	if (FileUpload.isMultipartContent(requestContext)) {
		DiskFileItemFactory factory = new DiskFileItemFactory();
		// 设置文件的缓存目录
		factory.setRepository(new File("d:/temp"));
		ServletFileUpload upload = new ServletFileUpload(factory);
		// 设置上传文件大小的上限,-1表示无上限
		upload.setSizeMax(100 * 1024 * 1024);
		List<FileItem> items = new ArrayList<FileItem>();
		try {
		    // 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
		     items = upload.parseRequest(request);
		} catch (FileUploadException e) {
		     log("发生错误:" + e.getMessage());
		}
		     // 下面对每个字段进行处理
		for (FileItem fileItem : items) {
		     // 普通字段
		if (fileItem.isFormField()) {
			if ("description1".equals(fileItem.getFieldName())) {
				log("遍历到 description1 ....");
				description1 = new String(
                                                 fileItem.getString()
                                                 .getBytes("ISO8859-1"), "UTF-8");
				log("文件1的描述:" + description1);
			} else if ("description2".equals(fileItem.getFieldName())) {
				log("遍历到 description2 ....");
				description2 = new String(
                                                   fileItem.getString()
                                                   .getBytes("ISO8859-1"), "UTF-8");
				log("文件2的描述:" + description2);
			}
		}
		// 文件字段
		else {
			if ("file1".equals(fileItem.getFieldName())) {
				log("遍历到 file1 ....");
				File remoteFile = new File(new String(
                                                               fileItem.getName()
								.getBytes(), "UTF-8"));
				log("客户端文件位置:" + remoteFile.getAbsolutePath());
				// 服务端文件,放到upload文件夹下
				file1 = new File(getServletContext()
                                                   .getRealPath("/upload/"
                                                   + remoteFile.getName()));
				// 创建文件夹路径
				file1.getParentFile().mkdirs();
				// 创建新文件
				file1.createNewFile();
				// 将输入流中的数据输出到指定文件中
				InputStream is = null;
				OutputStream os = null;
				try {
					is = fileItem.getInputStream();
					os = new FileOutputStream(file1);
					byte[] buffer = new byte[1024];
					int len = 0; // 实际缓存长度
					while ((len = is.read(buffer)) != -1) { // 循环读入缓存
						os.write(buffer, 0, len);
					}
					log("--------已保存文件,路径为:" + file1.getAbsolutePath());
			          } catch (Exception e) {
					e.printStackTrace();
				  } finally {
					if (is != null)
					   is.close();
					if (os != null)
					   os.close();
				   }
 
			} else if ("file2".equals(fileItem.getFieldName())) {
				log("遍历到 file2 ....");
				File remoteFile = new File(new String(
                                                               fileItem.getName()
								.getBytes(), "utf-8"));
				log("客户端文件位置:" + remoteFile.getAbsolutePath());
				// 服务端文件,放到upload文件夹下
				file2 = new File(getServletContext()
                                                          .getRealPath("upload")
							+ remoteFile.getName());
				// 创建文件夹路径
				file2.getParentFile().mkdirs();
				// 创建新文件
				file2.createNewFile();
				// 将输入流中的数据输出到指定文件中
				InputStream is = null;
				OutputStream os = null;
				try {
					is = fileItem.getInputStream();
					os = new FileOutputStream(file2);
					byte[] buffer = new byte[1024];
					int len = 0; // 实际缓存长度
					while ((len = is.read(buffer)) != -1) { // 循环读入缓存
						os.write(buffer, 0, len);
					}
					log("--------已保存文件,路径为:" + file2.getAbsolutePath());
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if (is != null)
						is.close();
					if (os != null)
						os.close();
					}
				}
			}
		}
	   }
     }
 
     protected void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
	this.doGet(request, response);
     }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值