文件上传
我们第三方的组件来完成上传功能。用到commons-fileupload 组件,它又需要commons-io组件的支持。
commons-fileupload 组件下载:http://commons.apache.org/fileupload/
用1.2版本
commons-io组件下载:http://commons.apache.org/io/
这有2.0版本
解压件commons-fileupload-1.2.2-bin.zip得到
lib文件下commons-fileupload-1.2.2.jar就是我们要的东西了。
同样解压commons-io-2.0.1-bin.zip得到
我们把commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar拷到项目的WEB-INF\lib目录下,配置工作为完成了。
上传文件选择表单页面
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<head>
<title>commonfileupload 上传文件示例</title>
</head>
<body>
<font size="2">
commonfileupload 上传文件示例<br>
<form method="post" action="FileUpload" ENCTYPE="multipart/form-data">
文件:<input type="file" name="file">
<html>
<head>
<title>commonfileupload 上传文件示例</title>
</head>
<body>
<font size="2">
commonfileupload 上传文件示例<br>
<form method="post" action="FileUpload" ENCTYPE="multipart/form-data">
文件:<input type="file" name="file">
<input type="submit" value="上传" name="submit">
</form>
</font>
</body>
</html>
</form>
</font>
</body>
</html>
FileUpload.java
当然只写了doPost,我们jsp里面的方法就是post.
package servlets;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
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.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUpload extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
Iterator items;
try {
items = upload.parseRequest(request).iterator();
while (items.hasNext()) {
FileItem item = (FileItem) items.next();
if (!item.isFormField()) {
//取出上传文件的文件名称
String name = item.getName();
String fileName = name.substring(name.lastIndexOf('\\')+1,name.length());
String path = request.getRealPath("file")+File.separatorChar+fileName;
//上传文件
File uploadedFile = new File(path);
item.write(uploadedFile);
public class FileUpload extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
Iterator items;
try {
items = upload.parseRequest(request).iterator();
while (items.hasNext()) {
FileItem item = (FileItem) items.next();
if (!item.isFormField()) {
//取出上传文件的文件名称
String name = item.getName();
String fileName = name.substring(name.lastIndexOf('\\')+1,name.length());
String path = request.getRealPath("file")+File.separatorChar+fileName;
//上传文件
File uploadedFile = new File(path);
item.write(uploadedFile);
//打印上传成功信息
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
out.print("<font size='2'>上传的文件为:"+name+"<br>");
out.print("保存的地址为:"+path+"</font>");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
out.print("<font size='2'>上传的文件为:"+name+"<br>");
out.print("保存的地址为:"+path+"</font>");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这里可能会出现一个错误:
提示是java.io.FileNotFoundException: D:\Workplace\.metadata\.me_tcat\webapps\file\file\001.txt (系统找不到指定的路径。)
我在file里面建好它要用的file目录就好了。
【boolean isMultipart = ServletFileUpload.isMultipartContent(request);】这行代码可以判断出提交过来的表单是否为文件上传表单,如果不是文件上传表单,在后续的处理中就不再用文件上传功能来处理这个表单。
【FileItemFactory factory = new DiskFileItemFactory();】
【ServletFileUpload upload = new ServletFileUpload(factory);】
【ServletFileUpload upload = new ServletFileUpload(factory);】
构造了一个文件上传处理对象。
【items = upload.parseRequest(request).iterator();】解析出表单中提交的所有文件内容。
【String name = item.getName();】
【String fileName = name.substring(name.lastIndexOf('\\')+1,name.length());】
【String path = request.getRealPath("file")+File.separatorChar+fileName】
【String name = item.getName();】
【String fileName = name.substring(name.lastIndexOf('\\')+1,name.length());】
【String path = request.getRealPath("file")+File.separatorChar+fileName】
这段代码可以取出文件名,并且得出这个文件上传到服务器以后存储的路径。上传的文件将被存储再当前应用项目的file 文件夹中。
【File uploadedFile = new File(path);】
【item.write(uploadedFile);】
【item.write(uploadedFile);】
把上传的文件存储到服务器中,完成上传操作。
文件下载
文件下载不用第三方组件。
在“上传文件选择表单页面”中添加一个下载的链接:<a href="FileDownload?filename=test.xls">下载文件</a>
FileDownload.java
这里就只写主要代码了,本代码来自http://www.blogjava.net/sxyx2008/archive/2010/12/10/340279.html
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String path=request.getParameter("filename");
path=new String(path.getBytes("ISO-8859-1"),"utf-8");
download(path,request,response);//调用下面的方法
}
public HttpServletResponse download(String path,HttpServletRequest request, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(request.getRealPath("/")+"/"+path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
//String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
path=new String(path.getBytes("ISO-8859-1"),"utf-8");
download(path,request,response);//调用下面的方法
}
public HttpServletResponse download(String path,HttpServletRequest request, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(request.getRealPath("/")+"/"+path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
//String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("utf-8"),"ISO-8859-1"));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
InputStream fis = new BufferedInputStream(new FileInputStream(file));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("utf-8"),"ISO-8859-1"));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}