`

Servlet实现文件的上传

 
阅读更多

        我们在做项目中经常要用到上传和下载的功能包括Excel文件word文档还有图片等不同格式的文件,今天特地搜搜了完成了上传功能,使用的是Servlet实现之,其实struts2也是封装了上传功能的本篇用servlet:

下面是我的基础代码

package com.ego.servlet;

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

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

import com.ego.util.FileUtil;

public class FileUploadServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 908207994857886273L;

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		/* 
		 * 注意,当jsp中表单的enctype设置的为:multipart/form-data的时候 我们无法直接使用 
		 * request.getParameter("") 获取表单的数据信息 
		 */  
		// 使用DiskFileItemFacotry类进行表单的处理,以及文件的上传  

		DiskFileItemFactory disk = new DiskFileItemFactory();
		
		//这里设置上传的文件存放的路径可以是绝对路径
		//也可以获取项目位置 String path = req.getRealPath("C:/upload");
		String path = "C:/upload";
		FileUtil.judgeDirExists(path); //判断路径是否存在不存在自动创建路径
 		disk.setRepository(new File(path));//设置上传文件的缓存目录
		disk.setSizeThreshold(1024*1024);//设置文件的大小,如果超过限制大小直接存进硬盘
		
		//借助ServletFileUpload进行表单的解析,与文件的流处理
		ServletFileUpload upload = new ServletFileUpload(disk);
		try {
			List<FileItem> list = upload.parseRequest(req);
			//List<FileItem>中保存着有关表单元素的所有信息 需要对它进行遍历
			for(FileItem item:list){
				//item.isFormField()判断该元素是否为表单的一个字段,
				//如果是则可以直接取得它的名称和内容
				if(item.isFormField()){
					String name = item.getFieldName();
					/* 
					 * 获取该字段的名称 如:<input type="text" name="password"/> 
					 * 该方法便是获取name属性的值 :password 
					 */ 
					String value = item.getString();
					/*获取该字段的value属性的值gbk为页面编码*/
				}else{
					//如果item.isFormField()方法返回false则证明该item为一个File类型
					String name = item.getFieldName();
					String value = item.getName();
					/*
					 *对于表单中的file元素,我们不能通过getString()方法获取其内容,因为它是一个流
					 *只能够通过getName方法获取当前文件的名称 
					 */
					int start =  value.lastIndexOf("\\");
					//对value惊醒处理,由于某些浏览器可能只显示 文件名+后缀名
					//有的则将文件的全部路径都显示和粗来,所有我们要在这里对它进行一次通用处理
					String fileName = value.substring(start+1);
					//记住一定要将start+1因为start的位置对应的是'\\'
					req.setAttribute(name, fileName);
					//创建输入流 与输出流
					InputStream input = item.getInputStream();
					byte[] buffer = new byte[1024];
					int length = 0;
					OutputStream os = new FileOutputStream(new File(path,fileName));
					
					//开始读取并写入信息
					while((length = input.read(buffer))>0){
						os.write(buffer,0,length);
					}
					//一次关闭流
					os.close();
					input.close();
					//上传完毕
					System.out.println("上传完毕!");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		req.getRequestDispatcher("/result.jsp").forward(req, res);
	}

	
}

 这里用到了一个文件工具类:

写道
package com.ego.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


/**
* 文件操作工具类
*
* @author ZhangZheng
* @date 2013-07-03
*/
public class FileUtil {

/**
* 判断某个文件是否存在
* >>如果不存在则创建该文件
* @param filePath 文件绝对路径
*/
public static void judgeFileExists(String filePath) throws IOException{
//根据路径获得文件对象
File file = new File(filePath);
//判断文件是否存在
if(!file.exists()){
//获得文件所在目录名称和文件名称
String dirStr = "";
String fileName = "";
if(filePath.lastIndexOf("/")>0){
dirStr = filePath.substring(0, filePath.lastIndexOf("/"));
fileName = filePath.substring(filePath.lastIndexOf("/"));
}else if(filePath.lastIndexOf("\\")>0) {
dirStr = filePath.substring(0, filePath.lastIndexOf("\\"));
fileName = filePath.substring(filePath.lastIndexOf("\\"));
}
//判断目录是否存在,如果不存在则创建该目录
File dir = new File(dirStr);
if(!dir.exists()){
dir.mkdirs();
}
//判断文件是否存在,如果不存在则创建该文件
File f = new File(fileName);
if(!f.exists()){
f.createNewFile();
}
}
}

/**
* 判断某个文件夹是否存在
* >>如果不存在则创建该文件夹及其子文件夹
* @param dirPath 文件夹路径
*/
public static void judgeDirExists(String dirPath){
File dir=new File(dirPath);
//如果文件夹不存在
if(!dir.exists()){
//创建文件夹(包括其中的子文件夹)
dir.mkdirs();
}
}

/**
* 复制文件
* >>把一个文件的内容复制到另一个文件中
* @param src 源文件路径
* @param dest 目标文件路径
*/
public static void copyFile(String src,String dest) throws IOException{
//判断目标文件是否存在
judgeFileExists(dest);
//源文件输入流和目标文件输出流
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dest);
int n;
byte[] buffer = new byte[1024];
while((n=in.read(buffer))!=-1){
//每次读取一个字节数组
out.write(buffer,0,n);
}
//关闭流
in.close();
out.close();
}

/**
* 复制文件
* @param in 源文件输入流
* @param out 目标文件输出流
*/
public static void copy(InputStream in, OutputStream out) throws IOException {
// 512K缓冲
byte[] buf = new byte[1024 * 512];
int n;
while ((n = in.read(buf)) != -1) {
out.write(buf, 0, n);
}
out.flush(); // 刷出缓冲到目标流
in.close();
out.close();
}

/**
* 删除文件夹(递归删除)
* @param file 要被删除的文件对象
*/
public static void deleteDir(File file){
//如果是文件
if(file.isFile() || file.list().length == 0){
file.delete();
}
//如果是文件夹
if(file.isDirectory()){
File[] files = file.listFiles();
//如果文件夹有子文件
if(files.length>0){
for(File f : files){
//递归删除每一个文件
deleteDir(f);
}
}
//最后删除该文件夹(不加此行代码表示:只删除该目录下的所有文件及其子文件夹,但保留该目录)
file.delete();
}
}

/**
* 删除文件(根据间隔时间删除)
* @param file 文件对象
* @param time 间隔时间(毫秒)
*/
public static void deleteFile(final File file,final int time){
//休眠指定时间之后,删除文件
new Thread(new Runnable() {
public void run() {
try {
// 线程休眠
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 删除文件
file.delete();
}
}).start();
}

// public static void main(String[] args) throws Exception {
// File file=new File("F:/co");
// System.out.println(file.exists());
// }

}
 

 

写道
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<!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=gbk">
<title>Insert title here</title>
</head>
<script type="text/javascript">
//一定要设置form表单的 //method属性和enctype实行
</script>
<body>
<form action="uploadServlet" method="post"
enctype="multipart/form-data">
用户名:<input type="text" name="username" id="username" /><br />
密码:<input type="password" name="password" id="password" /><br />
上传文件: <input type="file" name="file" id="file" /><br />
<input type="submit" value="提交" />
</form>
</body>
</html>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics