<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    JSP頁面如何實現文件上傳下載

    時間:2025-01-24 01:58:54 java語言 我要投稿
    • 相關推薦

    JSP頁面如何實現文件上傳下載

      Java 技術具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應用于PC、數據中心、游戲控制臺、科學超級計算機、移動電話和互聯網,同時擁有全球最大的開發者專業社群。下面,小編為大家搜索整理了JSP頁面如何實現文件上傳下載,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!

      名稱:jsp頁面上傳類

      作者:SinNeR

      Mail:vogoals[at]hotmail.com

      特點:

      可以多文件上傳;

      返回上傳后的文件名;

      form表單中的其他參數也可以得到。

      先貼上傳類,JspFileUpload

      package com.vogoal.util;

      import java.io.BufferedOutputStream;

      import java.io.File;

      import java.io.FileOutputStream;

      import java.io.IOException;

      import java.text.SimpleDateFormat;

      import java.util.ArrayList;

      import java.util.Date;

      import java.util.Hashtable;

      import javax.servlet.ServletInputStream;

      import javax.servlet.http.HttpServletRequest;

      /*

      * vogoalAPI 1.0

      * Auther SinNeR@blueidea.com

      * by vogoal.com

      * mail: vogoals@hotmail.com

      */

      /**

      * JSP上傳文件類

      *

      * @author SinNeR

      * @version 1.0

      */

      public class JspFileUpload {

      /** request對象 */

      private HttpServletRequest request = null;

      /** 上傳文件的路徑 */

      private String uploadPath = null;

      /** 每次讀取得字節的大小 */

      private static int BUFSIZE = 1024 * 8;

      /** 存儲參數的Hashtable */

      private Hashtable paramHt = new Hasptable();

      /** 存儲上傳的文件的文件名的ArrayList */

      private ArrayList updFileArr = new ArrayList();

      /**

      * 設定request對象。

      *

      * @param request

      * HttpServletRequest request對象

      */

      public void setRequest(HttpServletRequest request) {

      this.request = request;

      }

      /**

      * 設定文件上傳路徑。

      *

      * @param path

      * 用戶指定的文件的上傳路徑。

      */

      public void setUploadPath(String path) {

      this.uploadPath = path;

      }

      /**

      * 文件上傳處理主程序。

      *

      * @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3

      * 沒有設定正確的enctype;4 文件操作異常。

      */

      public int process() {

      int status = 0;

      // 文件上傳前,對request對象,上傳路徑以及enctype進行check。

      status = preCheck();

      // 出錯的時候返回錯誤代碼。

      if (status != 0)

      return status;

      try {

      // 參數或者文件名

      String name = null;

      // 參數的value

      String value = null;

      // 讀取的流是否為文件的標志位

      boolean fileFlag = false;

      // 要存儲的文件。

      File tmpFile = null;

      // 上傳的文件的名字

      String fName = null;

      FileOutputStream baos = null;

      BufferedOutputStream bos = null;

      // 存儲參數的Hashtable

      paramHt = new Hashtable();

      updFileArr = new ArrayList();

      int rtnPos = 0;

      byte[] buffs = new byte[BUFSIZE * 8];

      // 取得ContentType

      String contentType = request.getContentType();

      int index = contentType.indexOf("boundary=");

      String boundary = "--" + contentType.substring(index + 9);

      String endBoundary = boundary + "--";

      // 從request對象中取得流。

      ServletInputStream sis = request.getInputStream();

      // 讀取1行

      while ((rtnPos = sis.readLine(buffs, 0, buffs.length)) != -1) {

      String strBuff = new String(buffs, 0, rtnPos);

      // 讀取1行數據

      if (strBuff.startsWith(boundary)) {

      if (name != null && name.trim().length() > 0) {

      if (fileFlag) {

      bos.flush();

      baos.close();

      bos.close();

      baos = null;

      bos = null;

      updFileArr.add(fName);

      } else {

      Object obj = paramHt.get(name);

      ArrayList al = new ArrayList();

      if (obj != null) {

      al = (ArrayList) obj;

      }

      al.add(value);

      System.out.println(value);

      paramHt.put(name, al);

      }

      }

      name = new String();

      value = new String();

      fileFlag = false;

      fName = new String();

      rtnPos = sis.readLine(buffs, 0, buffs.length);

      if (rtnPos != -1) {

      strBuff = new String(buffs, 0, rtnPos);

      if (strBuff.toLowerCase().startsWith(

      "content-disposition: form-data; ")) {

      int nIndex = strBuff.toLowerCase().indexOf(

      "name=\"");

      int nLastIndex = strBuff.toLowerCase().indexOf(

      "\"", nIndex + 6);

      name = strBuff.substring(nIndex + 6, nLastIndex);

      }

      int fIndex = strBuff.toLowerCase().indexOf(

      "filename=\"");

      if (fIndex != -1) {

      fileFlag = true;

      int fLastIndex = strBuff.toLowerCase().indexOf(

      "\"", fIndex + 10);

      fName = strBuff.substring(fIndex + 10, fLastIndex);

      fName = getFileName(fName);

      if (fName == null || fName.trim().length() == 0) {

      fileFlag = false;

      sis.readLine(buffs, 0, buffs.length);

      sis.readLine(buffs, 0, buffs.length);

      sis.readLine(buffs, 0, buffs.length);

      continue;

      }else{

      fName = getFileNameByTime(fName);

      sis.readLine(buffs, 0, buffs.length);

      sis.readLine(buffs, 0, buffs.length);

      }

      }

      }

      } else if (strBuff.startsWith(endBoundary)) {

      if (name != null && name.trim().length() > 0) {

      if (fileFlag) {

      bos.flush();

      baos.close();

      bos.close();

      baos = null;

      bos = null;

      updFileArr.add(fName);

      } else {

      Object obj = paramHt.get(name);

      ArrayList al = new ArrayList();

      if (obj != null) {

      al = (ArrayList) obj;

      }

      al.add(value);

      paramHt.put(name, al);

      }

      }

      } else {

      if (fileFlag) {

      if (baos == null && bos == null) {

      tmpFile = new File(uploadPath + fName);

      baos = new FileOutputStream(tmpFile);

      bos = new BufferedOutputStream(baos);

      }

      bos.write(buffs, 0, rtnPos);

      baos.flush();

      } else {

      System.out.println("test :" + value + "--" + strBuff);

      value = value + strBuff;

      }

      }

      }

      } catch (IOException e) {

      status = 4;

      }

      return status;

      }

      private int preCheck() {

      int errCode = 0;

      if ( request == null )

      return 1;

      if ( uploadPath == null || uploadPath.trim().length() == 0 )

      return 2;

      else{

      File tmpF = new File(uploadPath);

      if (!tmpF.exists())

      return 2;

      }

      String contentType = request.getContentType();

      if ( contentType.indexOf("multipart/form-data") == -1 )

      return 3;

      return errCode;

      }

      public String getParameter(String name){

      String value = "";

      if ( name == null || name.trim().length() == 0 )

      return value;

      value = (paramHt.get(name) == null)?"":(String)((ArrayList)paramHt.get(name)).get(0);

      return value;

      }

      public String[] getParameters(String name){

      if ( name == null || name.trim().length() == 0 )

      return null;

      if ( paramHt.get(name) == null )

      return null;

      ArrayList al = (ArrayList)paramHt.get(name);

      String[] strArr = new String[al.size()];

      for ( int i=0;i

      strArr[i] = (String)al.get(i);

      return strArr;

      }

      public int getUpdFileSize(){

      return updFileArr.size();

      }

      public String[] getUpdFileNames(){

      String[] strArr = new String[updFileArr.size()];

      for ( int i=0;i

      strArr[i] = (String)updFileArr.get(i);

      return strArr;

      }

      private String getFileName(String input){

      int fIndex = input.lastIndexOf("\\");

      if (fIndex == -1) {

      fIndex = input.lastIndexOf("/");

      if (fIndex == -1) {

      return input;

      }

      }

      input = input.substring(fIndex + 1);

      return input;

      }

      private String getFileNameByTime(String input){

      int index = input.indexOf(".");

      Date dt = new Date();

      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");

      return input.substring(0,index) + sdf.format(dt) + input.substring(index);

      }

      }

      說明:

      這個類基本解決了上一貼的上一貼說的存在的bug和不足。主要做了如下修正。

      用戶可以設定文件上傳的路徑,這里沒有用request對象的getRealPath方法來取得相對路徑,而是用了絕對路徑。是一個小敗筆。因為有時候用戶只是得到服務器的一個應用,而不知道整個服務器的路徑。但是既然getRealPath自己可以得到,用戶自己取得也可以。

      在文件上傳處理的時候,預先進行了check,把一些可能出現的造成上傳失敗的情況拍查掉。避免該類出現不該出現的異常。

      捕獲了IO異常,避免文件上傳的時候出現異常時程序的不友好表現

      提供了方法返回form表單中其他參數的取得,模擬了HttpServletRequest對象的getParameter和getParameters方法(后面這個方法是叫這個名字么-_-b),取得Parameter的名稱的方法沒有提供,是個小缺陷。

      提供了方法返回上傳的文件的件數和上傳的文件名,方便用戶作其他操作。

      現在介紹下JSP頁面中如何用這個類實現上傳。

      首先,要把這個類編譯后的class文件拷貝到WEB-INF/classes/目錄下。注意保持package的結構。

      在jsp頁面中引用這個類

      使用的時候的注意事項:

      一定要設定request對象。

      一定要設定正確的上傳路徑。

      執行完了之后才可以得到其他參數,因為執行了之后這些參數才被分析。

      1,2兩點如果沒有做到的話,process方法執行的時候匯報錯。

      各個用戶可用的方法及說明:

      設定requet對象。

      public void setRequest(HttpServletRequest request)

      設定文件上傳的路徑。

      public void setUploadPath(String path)

      文件上傳處理主程序。

      @return int 操作結果 0 文件操作成功;1 request對象不存在。 2 沒有設定文件保存路徑或者文件保存路徑不正確;3

      沒有設定正確的enctype;4 文件操作異常。

      public int process()

      根據name取得form表單中其他傳遞的參數的值(多個的話返回其中一個)

      public String getParameter(String name)

      根據name取得form表單中其他傳遞的參數的值(返回數組,可有多個)

      public String[] getParameters(String name)

      取得上傳成功文件的個數

      public int getUpdFileSize()

      取得上傳的文件名對應的數組。

      public String[] getUpdFileNames()

      注意process方法地返回值,在不是0的情況下操作失敗。

      以下提供測試類以及測試頁面(見附件):

      HelloPostFile.html

      HelloPostFile.jsp

      寫在jsp中的代碼的測試文件。

      HelloPostFileWithClass.html

      HelloPostFileWithClass.jsp

      抽出class后的測試文件。

      src在

      WEB-INF/src/

      class在

      WEB-INF/classes/

      另:

      由于這個文件被我在中文日文系統下編輯過,注釋出現亂碼,所以大部分都刪掉了,見諒。

      下載:WEB-INF.zip

      JSP文件下載類整理完成。可以在JSP頁面中實現簡單的下載,支持文件打包下載功能。支持將字符串或者流生成文件提供下載的功能。但是也有一些缺點。現把這個類的基本介紹總結如下。

      名稱:jsp頁面下載類

      作者:SinNeR

      Mail:vogoals[at]hotmail.com

      特點及功能介紹:

      支持單文件下載。支持多文件zip壓縮下載。多文件zip壓縮可在服務器保留或者刪除副本。支持將特定的字符串或者byte數組以指定的文件名提供下載。

      在下載過程中需要提供response對象。并且選擇下載形式。

      下載處理前先進行check,避免出現錯誤。

      下載處理過程中出錯時,會報告錯誤信息。

      日文系統下文件名是中文時出現亂碼問題。

      處理前需要進行相對繁瑣的設定。

      現介紹下使用者可見的方法的功能。

      設定實現下載必須的response對象。

      public void setResponse(HttpServletResponse response)

      設定下載方式:0 為普通單文件下載。 1 為多文件壓縮成zip包下載。 2 為將指定的字符串等拼接成文件內容提供給用戶下載。

      public void setDownType(int fileType)

      設定下載時顯示給用的文件名。

      public void setDisFileName(String fileName)

      壓縮文件下載時,設定壓縮文件暫時保存的路徑(路徑為絕對路徑)

      public void setZipFilePath( String path )

      壓縮文件下載時,設定服務器端生成的壓縮文件是否刪除。True 刪除;false 保留。

      public void setZipDelFlag(boolean b)

      壓縮文件下載時,設定要壓縮的文件的文件路徑(路徑為絕對路徑)

      public void setZipFileNames(String[] fileNames)

      單文件下載時,設定下載文件的路徑(絕對路徑)

      public void setDownFileName(String fileName)

      將字符串生成文件內容模擬下載時,設定文件的內容。參數為字符串(可多次調用)

      public int setFileContent(String fileContent)

      將字符串生成文件內容模擬下載時,設定文件的內容。參數為byte數組(可多次調用)

      返回值:0 操作正常; 9 出現IO異常。

      public int setFileContent(byte[] fileContent)

      將字符串生成文件內容模擬下載時,調用此方法結束文件內容設定。

      返回值:0 操作正常; 9 出現IO異常。

      public int setFileContentEnd()

      主處理函數。

      返回值: 0 處理正常;1 未設定response對象。 2 未設定文件下載方式。 3 未設定要顯示的文件名。 4 未設定要下載的文件路徑,或者設定的下載的文件路徑不存在。 9 IO異常。

      public int process()

      現在介紹不同下載模式下的簡單流程:

      單文件下載流程:

      //實例初始化

      JspFileDownload jfd = new JspFileDownload();

      //設定response對象

      jfd.setResponse(response);

      //設定文件下載模式 0 單文件下載。

      jfd.setDownType(0);

      //設定顯示的文件名 xxxx.xxx

      jfd.setDisFileName(filename);

      //設定要下載的文件的路徑,絕對路徑

      jfd.setDownFileName(filePath);

      //主處理函數。注意處理返回值。

      int result = jfd.process();

      多文件壓縮成ZIP文件下載:

      //實例初始化

      JspFileDownload jfd = new JspFileDownload();

      //設定response對象。

      jfd.setResponse(response);

      //設定下載模式 1 多文件壓縮成ZIP文件下載。

      jfd.setDownType(1);

      //設定顯示的文件名

      jfd.setDisFileName(filename);

      //設定要下載的文件的路徑(數組,絕對路徑)

      jfd.setZipFileNames(fileNames);

      //設定服務器端生成的zip文件是否保留。 true 刪除 false 保留,默認為false

      jfd.setZipDelFlag(true);

      //設定zip文件暫時保存的路徑 (是文件夾)

      jfd.setZipFilePath(zipfolder);

      //主處理函數 注意返回值

      Int result = jfd.process();

      將字符串生成為文件內容,模擬文件下載:

      //實例初始化

      JspFileDownload jfd = new JspFileDownload();

      //設定response對象。

      jfd.setResponse(response);

      //設定下載模式 2 將字符串作為文件內容,實現文件下載。

      jfd.setDownType(2);

      //設定文件顯示的名稱。

      jfd.setDisFileName(request.getParameter("filename"));

      //主處理函數,下載前check,注意返回值

      out.print(jfd.process());

      //設定要寫入文件的內容,參數可為字符串或者byte數組。可多次調用。

      jfd.setFileContent(request.getParameter("name"));

      //文件內容設定完了,調用函數。

      jfd.setFileContentEnd();

      以上就是簡單的使用介紹。下面貼出主處理類的代碼。由于在日文系統下編輯的文件。注釋只能寫英文,英文太差-_-b。多包涵。

      package com.vogoal.util;

      import java.io.BufferedInputStream;

      import java.io.File;

      import java.io.FileInputStream;

      import java.io.FileOutputStream;

      import java.io.IOException;

      import java.io.InputStream;

      import java.util.zip.ZipEntry;

      import java.util.zip.ZipOutputStream;

      import javax.servlet.http.HttpServletResponse;

      /*

      * vogoalAPI 1.0

      * Auther SinNeR@blueidea.com

      * by vogoal.com

      * mail: vogoals@hotmail.com

      */

      /**

      * JSP FILE DOWNLOAD SUPPORT

      *

      * @author SinNeR

      * @version 1.0

      */

      public class JspFileDownload {

      /** request object */

      private HttpServletResponse response = null;

      /** file type: -1 un-setting; 0 normal file; 1 zip file ;2 stream*/

      private int fileType = -1;

      /** file name to be displayed */

      private String disFileName = null;

      /** zip file path */

      private String zipFilePath = null;

      /** file to be zipped */

      private String[] zipFileNames = null;

      private boolean zipDelFlag = false;

      /** file to be downloaded */

      private String downFileName = null;

      /** error code 0 */

      private static final int PROCESS_OK = 0;

      /** error code 1 */

      private static final int RESPONSE_IS_NULL = 1;

      /** error code 2 */

      private static final int UNSET_DOWNLOADTYPE = 2;

      /** error code 3 */

      private static final int UNSET_DIS_FILE_NAME = 3;

      /** error code 4 */

      private static final int UNSET_DOWN_FILE_NAME = 4;

      /** error code 9 */

      private static final int IO_EXCEPTION = 9;

      /**

      * set response object

      * @param response response Object

      */

      public void setResponse(HttpServletResponse response){

      this.response = response;

      }

      /**

      * set file type 0 normal file; 1 zip file ;2 stream

      * @param fileType

      */

      public void setDownType(int fileType){

      this.fileType = fileType;

      }

      /**

      * set display file name

      * @param fileName

      */

      public void setDisFileName(String fileName){

      this.disFileName = fileName;

      }

      /**

      * set zip file path

      * @param fileNames

      */

      public void setZipFilePath( String path ){

      this.zipFilePath = path;

      }

      public void setZipDelFlag(boolean b){

      this.zipDelFlag = b;

      }

      /**

      * set zip file names

      * @param fileNames

      */

      public void setZipFileNames(String[] fileNames){

      this.zipFileNames = fileNames;

      }

      /**

      * set download file name

      * @param fileName

      */

      public void setDownFileName(String fileName){

      this.downFileName = fileName;

      }

      /**

      * set file content

      * @param fileContent

      */

      public int setFileContent(String fileContent){

      try{

      byte[] buffs = fileContent.getBytes("UTF-8");

      response.getOutputStream().write(buffs);

      }catch(IOException e){

      return IO_EXCEPTION;

      }

      return PROCESS_OK;

      }

      /**

      * set file content

      * @param fileContent

      */

      public int setFileContent(byte[] fileContent){

      try{

      response.getOutputStream().write(fileContent);

      }catch(IOException e){

      return IO_EXCEPTION;

      }

      return PROCESS_OK;

      }

      /**

      * set file content end

      *

      */

      public int setFileContentEnd(){

      try{

      response.getOutputStream().close();

      }catch(IOException e){

      return IO_EXCEPTION;

      }

      return PROCESS_OK;

      }

      /**

      * main process

      * @return

      */

      public int process(){

      int status = PROCESS_OK;

      status = preCheck();

      if ( status != PROCESS_OK )

      return status;

      String fileName = disFileName;

      response.setContentType("APPLICATION/OCTET-STREAM");

      response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");

      int BUFSIZE = 1024 * 8;

      int rtnPos = 0;

      byte[] buffs = new byte[ BUFSIZE ];

      FileInputStream inStream = null;

      ZipOutputStream zos = null;

      InputStream is = null;

      String filepath = null;

      try{

      if ( fileType == 0 || fileType == 1){

      if ( fileType == 0 ){

      filepath = downFileName;

      }else{

      filepath = zipFilePath + fileName;

      String[] fileToZip = zipFileNames;

      zos=new ZipOutputStream(new FileOutputStream(filepath));

      ZipEntry ze=null;

      byte[] buf=new byte[BUFSIZE];

      int readLen=0;

      for (int i= 0;i

      File f= new File(fileToZip[i]);

      ze=new ZipEntry(f.getName());

      ze.setSize(f.length());

      ze.setTime(f.lastModified());

      zos.putNextEntry(ze);

      is=new BufferedInputStream(new FileInputStream(f));

      while ((readLen=is.read(buf, 0, BUFSIZE))!=-1) {

      zos.write(buf, 0, readLen);

      }

      is.close();

      }

      zos.close();

      }

      inStream =new FileInputStream(filepath);

      while((rtnPos=inStream.read(buffs)) >0)

      response.getOutputStream().write(buffs,0,rtnPos);

      response.getOutputStream().close();

      inStream.close();

      }

      if ( zipDelFlag ){

      File fToDel = new File(filepath);

      fToDel.delete();

      }

      }catch(IOException e){

      return IO_EXCEPTION;

      }finally{

      try{

      if ( inStream != null ){

      inStream.close();

      inStream = null;

      }

      if ( zos != null ){

      zos.close();

      zos = null;

      }

      if ( is != null ){

      is.close();

      is = null;

      }

      }catch (IOException e){

      }

      }

      return status;

      }

      /**

      * pre check.

      * @return

      */

      private int preCheck(){

      if ( response == null )

      return RESPONSE_IS_NULL;

      if ( disFileName == null || disFileName.trim().length() == 0 )

      return UNSET_DIS_FILE_NAME;

      if ( fileType == -1 )

      return UNSET_DOWNLOADTYPE;

      else if ( fileType == 0 ){

      if ( downFileName == null || downFileName.trim().length() == 0 )

      return UNSET_DOWN_FILE_NAME;

      else{

      if ( !isFile( downFileName ) )

      return UNSET_DOWN_FILE_NAME;

      }

      }else if ( fileType == 1 ){

      if ( zipFilePath == null || zipFilePath.length() == 0 )

      return UNSET_DOWN_FILE_NAME;

      else{

      if ( !isDirect(zipFilePath) )

      return UNSET_DOWN_FILE_NAME;

      }

      if ( zipFileNames == null || zipFileNames.length == 0 )

      return UNSET_DOWN_FILE_NAME;

      else{

      for ( int i=0;i

      if ( zipFileNames[i] == null || zipFileNames[i].trim().length() == 0 )

      return UNSET_DOWN_FILE_NAME;

      else{

      if ( !isFile( zipFileNames[i] ) )

      return UNSET_DOWN_FILE_NAME;

      }

      }

      }

      }else if ( fileType == 2 ){

      //doing nothing

      }else{

      return UNSET_DOWNLOADTYPE;

      }

      return PROCESS_OK;

      }

      private boolean isFile(String fileName){

      File f = new File(fileName);

      if (!f.exists() || !f.isFile())

      return false;

      return true;

      }

      private boolean isDirect(String filePath){

      File f = new File(filePath);

      if (!f.exists() || !f.isDirectory())

      return false;

      return true;

      }

      }

      至此,jsp頁面文件下載介紹完成。

      使用的時候,把這個類生成的class文件拷貝到WEB-INF/classes下。(注意保持包的路徑)

      然后在使用的頁面import進這個class即可。

      注意:

      可能存在編碼方式的問題,如果出現或者有別的bug請聯系我,我來debug。

      附件為這個類的source以及測試程序。

      附件說明:

      單文件下載測試程序

      請求頁面:downloadSimpleFile.html

      下載功能實現頁面:downloadSimpleFile.jsp

      多文件壓縮成zip文件下載的測試程序

      請求頁面:downloadZipFile.html

      下載功能實現頁面:downloadZipFile.jsp

      字符串生成文件內容模擬文件下載的測試程序。

      請求頁面:downloadStreamFile.html

      下載功能實現頁面:downloadStreamFile.jsp

      Source及class文件。

      Source WEB-INF/src/com/vogoal/util/ JspFileDownload.java

      Class文件WEB-INF/classes/com/vogoal/util/ JspFileDownload.class

    【JSP頁面如何實現文件上傳下載】相關文章:

    JavaWeb如何實現文件上傳下載功能08-23

    如何使用JavaScript實現頁面定時跳轉10-18

    編寫Java無腳本的JSP頁面的方法08-18

    php頁面緩存實現方法07-20

    PHP頁面跳轉實現技巧09-19

    PHP中實現頁面跳轉07-06

    PHP頁面跳轉幾種實現技巧07-26

    如何使用php語言實現文件名稱08-17

    Html5如何實現文件異步上傳功能09-16

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人