java web文件的上传

一.引导

     在java web开发中,文件的上传和下载是非常常用的功能,本文将介绍文件上传的具体实现.

二.文件上传的环境搭建

     本文中所讲的上传实例需要的jar包:commons-io-2.5.jar ,  commons-fileupload-1.3.2.jar; 将这两个jar包导入项目中.

     jar包下载地址: https://pan.baidu.com/s/1dEMdWGh  密码: vmvx

三.具体代码的实现

     本文中的实例既包括上传界面以及核心servlet.先介绍核心servlet吧.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@WebServlet(urlPatterns="/fileupload")
public class fileupload extends HttpServlet{
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//得到上传文件的保存路径,如果不存在,就建立该路径
		String path = req.getServletContext().getRealPath("/WEB-INF/upload");
		File f = new File(path);
		if(f.exists()&&f.isDirectory()) {
			
		} else {
			//目录不存在,需要创建目录
			System.out.println("目录不存在");
			f.mkdirs();
		}
		//使用apache文件上传组件处理文件的顺序
		try {
			final long time = System.currentTimeMillis();
			//一.创建一个DiskFileItemFactory工厂
			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setSizeThreshold(1024*100);//设置缓冲区的大小
			File file = new File(req.getServletContext().getRealPath("/WEB-INF/temp"));
			if(!file.exists()||!file.isDirectory()) {
				file.mkdirs();
			}
			factory.setRepository(file);//设置临时缓冲区
			//二.创建文件上传解析器
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setProgressListener(new ProgressListener() {
				
				@Override
				public void update(long arg0, long arg1, int arg2) {
					// TODO Auto-generated method stub
					double progress = (double)arg0/arg1;
					System.out.println("上传进度:"+progress);
					long time2 = System.currentTimeMillis();
					System.out.println("上传速度"+arg0/(time2-time)+"kb/s");
					
				}
			});
			upload.setHeaderEncoding("utf-8");//解决文件上传的乱码问题
			List<FileItem> list = upload.parseRequest(req);//解析请求头
			for(FileItem item : list) {
				//如果封装的是一个普通的参数信息
				if(item.isFormField()) {
					String name = item.getFieldName();
					String value = item.getString("utf-8");
					System.out.println(name+":"+value);
				} else {
					String name = item.getName();
					if(name == null) {
						throw new RuntimeException("文件夹不能为空");
					}
					//ie浏览器是个奇葩,name带有路径,获取名称时需要解析
					if(name.contains("\\")) {
						name = name.substring(name.lastIndexOf("\\")+1);
					}
					//获取文件内容的输入流
					InputStream in = item.getInputStream();
					name = UUID.randomUUID()+"_"+name;
					FileOutputStream out = new FileOutputStream(path+"/"+name);
					//将文件上传到指定的位置
					int i = 0;
					while((i=in.read())!=-1) {
						out.write(i);
					}
					System.out.println("上传成功"+path);
					in.close();
					out.close();
					item.delete();//会将临时文件删掉
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
 
}
           介绍完核心servlet,该实例提供一个简单的jsp界面

<%@ 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>file upload!!!</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/fileupload" method="post" enctype="multipart/form-data">
	<table id="tb">
	     <tr>
                <td>文件信息<input type='text' name='info' /></td>
		<td>上传文件<input type='file' name='upload' /></td>
	     </tr>
	</table>
    </form>
</body>
<html>



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值