Servlet上传文件源码

参考自《Java Web整合开发王者归来》。

这里使用的是Apache Commons Fileupload类库,使用commons-fileupload-1.3.1.jar。


前提:

采用post方式;
需要设置form的enctype属性为multipart/form-data;
由于上传文件较大,需要设置该参数指定浏览器使用二进制上传。如果不设置,enctype默认为applicaton/x-www-form-urlencoded,浏览器将使用ASCII向服务器发送数据,导致文件发送失败。


html代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
	<form action="servlet/UploadServlet" method="post" enctype="multipart/form-data">
		<div align="center">
			<br/>
			<fieldset style="width: 80%;">
				<legend>上传文件</legend><br />
				<div class="line">
					<div align="left" class="leftDiv">上传文件1</div>
					<div align="left" class="rightDiv">
						<input type="file" name="file1" class="text" />
					</div>
				</div>
				
				<div class="line">
					<div align="left" class="leftDiv">上传文件2</div>
					<div align="left" class="rightDiv">
						<input type="file" name="file2" class="text" />
					</div>
				</div>
				
				<div class="line">
					<div align="left" class="leftDiv">上传文件说明1</div>
					<div align="left" class="rightDiv">
						<input type="text" name="description1" class="text" />
					</div>
				</div>
				
				<div class="line">
					<div align="left" class="leftDiv">上传文件说明2</div>
					<div align="left" class="rightDiv">
						<input type="text" name="description2" class="text" />
					</div>
				</div>
				
				<div class="line">
					<div align="left" class="leftDiv"></div>
					<div align="left" class="rightDiv"><br>
						<input type="submit" value="上传文件" class="button" />
					</div>
				</div>
			</fieldset>
		</div>
		
	</form>
	
	
</body>
</html>

Servlet后台代码:

package com.ice.servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import org.apache.catalina.core.ApplicationPart;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.StringUtils;
import org.apache.jasper.tagplugins.jstl.core.Out;

import com.sun.corba.se.impl.orbutil.closure.Constant;


/**
 * Servlet implementation class UploadServlet
 */
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	File tempFile;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doPost(request, response);
		response.setCharacterEncoding("utf-8");//设置输出编码
		response.getWriter().println("请以POST方式上传文件");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	@SuppressWarnings("unchecked")  //消除unchecked warning
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
//		PrintWriter out = response.getWriter();
//		String path = this.getServletContext().getRealPath("/");
//		Part p = request.getPart("file1");
//		if (p.getContentType().contains("image")) {
//			ApplicationPart apPart = (ApplicationPart)p;
//			String fileName = apPart.getFilename();
//			int path_idx = fileName.lastIndexOf("\\") + 1;
//			String fileName2 = fileName.substring(path_idx, fileName.length());
//			p.write(path + "/upload/" + fileName2);
//			out.write("文件上传成功");
//			
//		}else {
//			out.write("请选择图片文件!");
//		}
		
		File file1 = null;
		File file2 = null;
		String description1 = null,description2 = null;
		//DiskFileUpload diskFileUpload = new DiskFileUpload();//DiskFileUpload已经被标记为丢弃方法
		PrintWriter out = response.getWriter();
		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(4096);//缓冲区大小
		factory.setRepository(tempFile);//缓冲区目录
		
		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(4194304);//最大文件尺寸
		
		try {
			List<FileItem> list = upload.parseRequest(request);
			out.println("遍历所有FileItem...<br/>");
			for (FileItem fileItem : list) {
				if (fileItem.isFormField()) {//判断该表单项是否是普通类型,文本域
					if ("description1".equals(fileItem.getFieldName())) {
						out.println("遍历到description1...<br/>");
						description1 = new String(fileItem.getString().getBytes(),"utf-8");
					}
					if ("description2".equals(fileItem.getFieldName())) {
						out.println("遍历到description2...<br/>");
						description2 = new String(fileItem.getString().getBytes(), "utf-8");
					}
				}else {//文件域
					if ("file1".equals(fileItem.getFieldName())) {
						File remoteFile = new File(new String(fileItem.getName().getBytes(),"utf-8"));
						out.println("遍历到file1...<br/>");
						out.println("客户端文件位置:" + remoteFile.getAbsolutePath() + "<br/>");
						file1 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());
						boolean isExist = file1.getParentFile().mkdirs();//创建文件夹路径
						file1.createNewFile();//创建新文件
						InputStream inputStream = fileItem.getInputStream();
						OutputStream outputStream = new FileOutputStream(file1);//输出到文件中
						
						try {
							byte[] buffer = new byte[1024];//字节缓存
							int length = 0;
							while((length = inputStream.read(buffer)) > -1){
								outputStream.write(buffer, 0, length);//循环读入缓存
							}
							out.println("已保存文件:" + file1.getAbsolutePath() + "<br/>");
						} catch (Exception e) {
							// TODO: handle exception
						}finally{
							outputStream.close();
							inputStream.close();
						}
					}
					if ("file2".equals(fileItem.getFieldName()) && StringUtils.isNotEmpty(fileItem.getName())) {
						File remoteFile = new File(new String(fileItem.getName().getBytes(),"utf-8"));
						out.println("遍历到file2...<br/>");
						out.println("客户端文件位置:" + remoteFile.getAbsolutePath() + "<br/>");
						file2 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());
						file2.getParentFile().mkdirs();//创建文件夹路径
						file2.createNewFile();//创建新文件
						InputStream inputStream = fileItem.getInputStream();
						OutputStream outputStream = new FileOutputStream(file2);//输出到文件中
						
						try {
							byte[] buffer = new byte[1024];//字节缓存
							int length = 0;
							while((length = inputStream.read(buffer)) > -1){
								outputStream.write(buffer, 0, length);//循环读入缓存
							}
							out.println("已保存文件:" + file2.getAbsolutePath() + "<br/>");
						} catch (Exception e) {
							// TODO: handle exception
						}finally{
							outputStream.close();
							inputStream.close();
						}
					}
				}
			}
			out.println("Request 解析完毕!");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		if (file1 != null) {
			out.println("<div class='line'>");
			out.println("<div align='left' class='leftDiv'>file1:</div>");
			out.println("<div align='left' class='rightDiv'>");
			out.println("<a href='" + request.getContextPath() + "/attachment/" + new String(file1.getName().getBytes(), "utf-8") + "' target=_blank>" + file1.getName() + "</a>");
			out.println("</div>");
			out.println("</div>");
		}
		if (file2 != null) {
			out.println("<div class='line'>");
			out.println("<div align='left' class='leftDiv'>file2:</div>");
			out.println("<div align='left' class='rightDiv'>");
			out.println("<a href='" + request.getContextPath() + "/attachment/" + file2.getName() + "' target=_blank>" + file2.getName() + "</a>");
			out.println("</div>");
			out.println("</div>");
		}
		
		out.println("<div class='line'>");
		out.println("<div align='left' class='leftDiv'>description1:</div>");
		out.println("<div align='left' class='leftDiv'>");
		out.println(description1);
		out.println("</div>");
		out.println("</div>");
		
		out.println("<div class='line'>");
		out.println("<div align='left' class='leftDiv'>description1:</div>");
		out.println("<div align='left' class='leftDiv'>");
		out.println(description2);
		out.println("</div>");
		out.println("</div>");
	}

}

web.xml中配置:

  <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.ice.servlet.UploadServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/servlet/UploadServlet</url-pattern>
  </servlet-mapping>

附上结果:



以上。

在线文件管理系统的Java源码需要包括以下几个核心部分:前端页面、后端控制器、文件管理模块和数据库操作。 前端页面部分可以使用HTML、CSS和JavaScript等技术实现,可以使用Bootstrap或者其他CSS框架来美化界面,实现文件列表展示、上传下载、搜索等功能。 后端控制器部分使用Java web框架(如Spring MVC)来处理请求和响应,搭建网络服务。可以用Servlet或者Spring MVC注解来定义请求处理方法,处理文件上传、下载、删除等功能。 文件管理模块负责实现具体的文件操作,包括上传文件、下载文件、删除文件、搜索文件等。可以使用Java的File类来实现文件操作,也可以使用第三方文件操作库(如Apache Commons IO)来简化操作。 数据库操作利用Java的JDBC或者ORM框架(如MyBatis)来实现,将用户的文件信息存储在数据库中。可以设计一个文件表来存储文件的相关信息,例如文件名、路径、大小、上传时间等。 在系统运行时需要考虑并发访问的问题,可以使用线程池来处理并发请求,提高系统的并发能力。同时,可使用登录和权限认证来保护系统的安全性,确保只有经过认证的用户才能上传、下载和删除文件。 最后,在源码中应该包含适当的注释,方便其他开发人员了解和维护代码。 以上是一个基本的在线文件管理系统的Java源码框架,具体实现细节根据需求和业务需求可能有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值