Servlet实现文件的上传

来源:互联网 发布:不需要网络的电脑游戏 编辑:程序博客网 时间:2024/06/06 05:51

        我们在做项目中经常要用到上传和下载的功能包括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;@Overrideprotected 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>

 

0 0
原创粉丝点击