java web文件的上传

来源:互联网 发布:dev.mysql.com 编辑:程序博客网 时间:2024/05/23 00:07

一.引导

     在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{@Overrideprotected 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() {@Overridepublic void update(long arg0, long arg1, int arg2) {// TODO Auto-generated method stubdouble 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 blocke.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>



原创粉丝点击