天天看點

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