天天看点

Servlet中的上传下载文件

一、文件上传

文件的上传也是基于表单来完成的,表单中的file元素可以自动生成一个文本框和一个按钮,文本框可以输入本地文件名或路径,点击按钮则可以打开一个文件选择框让用户选中本地文件。需要注意的是在文件上传时还必须设置表单的enctype属性,并将它的值设置为multipart/form-data。

upload.jsp

  <form method="post" enctype="multipart/form-data"

   action="smartupladservlet.do">

   <input type="text" name="username"><br>

   <input type="file" name="myfile"><br>

   <input type="file" name="myfile2"><br>

   <input type="file" name="myfile3"><br>

   <input type="submit" value="上传">

  </form>

 </body>

这里使用的是smartupload,需要该包。

上传文件的servlet

import java.io.file;

import java.io.ioexception;

import java.io.printwriter;

import java.sql.sqlexception;

import javax.servlet.servletexception;

import javax.servlet.http.httpservlet;

import javax.servlet.http.httpservletrequest;

import javax.servlet.http.httpservletresponse;

import com.jspsmart.upload.smartupload;

import com.jspsmart.upload.smartuploadexception;

public class smartupladservlet extends httpservlet {

 public smartupladservlet() {

  super();

 }

 public void destroy() {

  super.destroy();

 public void doget(httpservletrequest request, httpservletresponse response)

   throws servletexception, ioexception {

  //文件上传个数

  int count = 0;

  //文件上传地址

  string filepath = getservletcontext().getrealpath("/")+"smartupload";

  //如果文件夹不存在 则创建这个文件夹

  file file = new file(filepath);

  if(!file.exists())

  {

   file.mkdir();

  }

  //初始化对象

  smartupload su = new smartupload();

  su.initialize(getservletconfig(),request,response);

  //设置文件最大容量

  su.setmaxfilesize(10*1024*1024);

  //设置所有文件最大容量

  su.settotalmaxfilesize(100*1024*1024);

  //设置上传文件类型

  su.setallowedfileslist("rar,txt,jpg,bmp,gif");

  try {

   //设置禁止上传的文件类型

   su.setdeniedfileslist("jsp,js,html,css");

   //上传文件

   su.upload();

   system.out.println("username=" + su.getrequest().getparameter("username"));

   count = su.save(filepath);

  } 

  catch (sqlexception e) {

   e.printstacktrace();

  catch (smartuploadexception e) {

  for (int i = 0; i < su.getfiles().getcount(); i++) {

   com.jspsmart.upload.file tempfile = su.getfiles().getfile(i);

   system.out.println("表单项名称:" + tempfile.getfieldname());

   system.out.println("文件名:" + tempfile.getfilename());

   system.out.println("文件长度:" + tempfile.getsize());

   system.out.println("文件扩展名:" + tempfile.getfileext());

   system.out.println("文件全名:" + tempfile.getfilepathname());

  system.out.println("上传成功!共" + count + "个文件!"); 

 public void dopost(httpservletrequest request, httpservletresponse response)

  doget(request,response);

 public void init() throws servletexception {

}

web.xml文件配置

  <servlet>

    <description>this is the description of my j2ee component</description>

    <display-name>this is the display name of my j2ee component</display-name>

    <servlet-name>smartupladservlet</servlet-name>

    <servlet-class>com.kay.servlet.smartupladservlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <url-pattern>/smartupladservlet.do</url-pattern>

  </servlet-mapping>

二、文件下载

通过超链接下载文件,会暴露了下载文件在服务器中的真实地址,不利于对资源进行安全保护,而且利用超链接下载文件,服务器端得文件只能存放在web应用程序所在的目录下。利用程序编码实现下载,可以增加安全机制,比如我们只能让vip会员下载等等。还可以从任意位置进行下载,我们可以将文件放到web应用程序外的目录中。

显示文件夹内所有文件的servlet

import java.util.arraylist;

import java.util.list;

public class showfileservlet extends httpservlet {

  string path = "c:/file";

  //声明集合存放目录下所有文件的文件名

  list<string> filelist = new arraylist<string>();

  file folder = new file(path);

  //判断文件夹是否存在并且是否是一个目录

  if(folder.exists() && folder.isdirectory()){

   //获得目录中所有文件及目录

   file[] files = folder.listfiles();

   for (file file : files) {

    //如果是文件

    if(file.isfile()){

     //将文件名放入集合中

     filelist.add(file.getname());

    }

   }

  request.setattribute("filelist", filelist);

  request.getrequestdispatcher("showfile.jsp").forward(request, response);

showfile.jsp

<%@ page language="java" pageencoding="utf-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!doctype html public "-//w3c//dtd html 4.01 transitional//en">

<html>

  <head>

    <title>显示所有文件</title>

  </head>

  <body>

   请选择您要下载的文件:<br/>

    <c:foreach items="${filelist}" var="filename">

     <a href="downloadservlet?filename=${filename }">${filename }</a><br/>

    </c:foreach>

  </body>

</html>

下载文件的downloadservlet

import java.io.bufferedinputstream;

import java.io.bufferedoutputstream;

import java.io.fileinputstream;

import java.io.inputstream;

import javax.servlet.servletoutputstream;

public class downloadservlet extends httpservlet {

  string filename = request.getparameter("filename");

  file file = new file(path + "/" + filename);

  //如果文件存在

  if (file.exists()) {

   //设置响应类型及响应头

   response.setcontenttype("application/x-msdownload");

   response.addheader("content-disposition", "attachment; filename=\""

     + filename + "\"");

   //读取文件

   inputstream inputstream = new fileinputstream(file);

   bufferedinputstream bis = new bufferedinputstream(inputstream);

   byte[] bytes = new byte[1024];

   servletoutputstream outstream = response.getoutputstream();

   bufferedoutputstream bos = new bufferedoutputstream(outstream);

   int readlength = 0;

   while ((readlength = bis.read(bytes)) != -1) {

    bos.write(bytes, 0, readlength);

   //释放资源

   inputstream.close();

   bis.close();

   bos.flush();

   outstream.close();

   bos.close();

  doget(request, response);

原帖地址:http://blog.sina.com.cn/s/blog_60f823dd01017nz9.html