Servlet文件上传下载

文件上传

 

我们第三方的组件来完成上传功能。用到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得到

2011年08月27日 - 某丶丶人 - 某丶丶人

 lib文件下commons-fileupload-1.2.2.jar就是我们要的东西了。

同样解压commons-io-2.0.1-bin.zip得到

2011年08月27日 - 某丶丶人 - 某丶丶人
 commons-io-2.0.1.jar就是要用的东西。
我们把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">
<input type="submit" value="上传" name="submit">
</form>
</font>
</body>
</html>
Servlet文件上传下载 - 某丶丶人 - 某丶丶人
 
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 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);
//打印上传成功信息
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目录就好了。
Servlet文件上传下载 - 某丶丶人 - 某丶丶人
 【boolean isMultipart = ServletFileUpload.isMultipartContent(request);】这行代码可以判断出提交过来的表单是否为文件上传表单,如果不是文件上传表单,在后续的处理中就不再用文件上传功能来处理这个表单。
【FileItemFactory factory = new DiskFileItemFactory();】
【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】
这段代码可以取出文件名,并且得出这个文件上传到服务器以后存储的路径。上传的文件将被存储再当前应用项目的file 文件夹中。
【File uploadedFile = new File(path);】
【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 javax.servlet.ServletException;
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();
            // 以流的形式下载文件。
            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;
    }
 
Servlet文件上传下载 - 某丶丶人 - 某丶丶人
 
 
 这里下载的文件就是D:\Workplace\.metadata\.me_tcat\webapps\file目录下的文件。
Servlet文件上传功能可以通过使用注解@MultipartConfig将Servlet标识为支持文件上传,然后将multipart/form-data的POST请求封装成Part对象,通过Part对象对上传的文件进行操作。以下是一个文件上传Servlet示例代码: ```java @WebServlet("/uploadServlet") @MultipartConfig // 如果是文件上传,必须要设置该注解! public class UploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("文件上传..."); // 设置请求的编码格式 req.setCharacterEncoding("UTF-8"); // 获取普通表单项(获取参数) String uname = req.getParameter("uname"); // 表单表单元素的name属性值 System.out.println("uname: " + uname); // 获取Part对象(Servlet将multipart/form-data的POST请求封装成Part对象) Part part = req.getPart("myfile"); // 通过Part对象得到上传的文件名 String fileName = part.getSubmittedFileName(); System.out.println("上传文件名:" + fileName); // 得到文件存放的路径 String filePath = req.getServletContext().getRealPath("/"); System.out.println("文件存放路径:" + filePath); // 上传文件到指定目录 part.write(filePath + "/" + fileName); } } ``` 而文件下载功能可以通过设置download属性来实现。以下是一个文件下载的JSP页面的示例代码: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>文件下载</title> </head> <body> <!-- 浏览器能够识别的资源 --> <a href="download/hello.txt">文本文件</a> <a href="download/pic.jpg">图片文件</a> <!-- 浏览器不能够识别的资源 --> <a href="download/zzz.rar">压缩文件</a> <hr> <a href="download/hello.txt" download>文本文件</a> <a href="download/pic.jpg" download="test.png">图片文件</a> <hr> <form action="downloadServlet"> 文件名:<input type="text" name="fileName" placeholder="请输入要下载的文件名"> <button>下载</button> </form> </body> </html> ``` 以上是文件上传下载的实现方法,你可以根据需要进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值