天天看點

用SmartUpload實作檔案上傳,下載下傳,删除1、什麼是上傳和下載下傳?

1、什麼是上傳和下載下傳?

資料上傳是指用戶端向伺服器上傳資料,用戶端向伺服器發送的所有請求都屬于資料上傳。檔案上傳是資料上傳的一種特例,指的是用戶端向伺服器上傳檔案。即将儲存在用戶端的檔案上傳至伺服器中的一個副本,儲存到伺服器中。

- 資料下載下傳是指用戶端從伺服器上擷取資料的過程。檔案下載下傳是資料下載下傳的一種特例,指的是用戶端從伺服器下載下傳檔案,即将原來儲存在伺服器中的檔案下載下傳到用戶端中一個副本儲存。通常我們對伺服器所發出的請求,大多數是檔案下載下傳請求,從伺服器中下載下傳文本、圖檔、聲音、視訊等檔案,然後由用戶端浏覽器對這些檔案進行解析後,才可能看到這些多媒體資訊。

- 但是我們這裡所說的檔案下載下傳,指的是檔案從伺服器下載下傳到浏覽器後,浏覽器并不直接解析,而是以附件的形式儲存到用戶端中。

- 上傳與下載下傳的檔案可以是文本檔案、圖檔、聲音、視訊等各種類型。

b8f92803d83bf1eeb80b10fbce113a91.png

2、檔案上傳的實作:

a、上傳時對表單的要求:

- 檔案上傳要求用戶端表單送出特殊的請求–multipart請求,即包含多部分資料的請求。是以檔案上傳表單對于表單資料的編碼類型要求,必須為multipart/form-data。即要為标簽指定enctype屬性值為“multipart/form-data”。(enctype,即encodingtype,編碼類型。)

- 由于用戶端上傳檔案的大小是不确定的,是以HTTP協定規定,檔案上傳的資料要存放于請求正文中,而不能夠出現在url的位址欄中,因為位址欄中可以存放的資料量太小。也就是說,檔案上傳的表單,必須送出POST請求,而不能夠送出GET請求。

這裡介紹的是用jsp+servlet實作的;

jsp表單代碼就不貼了,注意2點就行:

1、表單送出必須用post方式 (method=“post”)

2、設定表單enctype屬性為”multipart/form-data”

上傳

//指定檔案存放位置
      String filePath = "/images";//這裡的斜杠表示項目根目錄
      //建立檔案夾對象(未真正建立檔案夾)
      File file = new File(filePath);
      //如果指定路徑檔案夾不存在就建立一個檔案夾
      if(!file.exists()) {
          file.mkdirs();
          /*file.createNewFile();//這裡的檔案對象建立時參數要加上file名*/     
      }
      //建立SmartUpload對象
      SmartUpload su = new SmartUpload();
      //初始化SmartUpload對象
      su.initialize(getServletConfig(),request,response);
      //設定上傳檔案的最大值
      su.setMaxFileSize(**);
      //設定上傳檔案的總最大值
      su.setTotalMaxFileSize(**);
      //設定允許上傳檔案類型
      su.setAllowedFilesList("jpg,gif,jpeg,png");
      try {
        //設定不允許上傳的檔案類型
        //su.setDeniedFilesList("rar,txt,mp4,mp3,zip");
        //上傳
        su.upload();
        Files files = su.getFiles();
        com.jspsmart.upload.File file1;
        for(int i=;i<files.getCount();i++ ) {
            file1 = files.getFile(i);

    //周遊上傳的所有檔案,設定檔案名,這裡用了自己寫的一個工具類UniqueId生成唯一id作為圖檔的id檔案名
         file1.saveAs(filePath+"/"+UniqueId.getId()+Math.random()+"."+file1.getFileExt());
        //儲存檔案到指定路徑,傳回上傳了多少個檔案
        //int n = su.save(filePath);
        //System.out.println("上傳了"+n+"個檔案");
        System.out.println(file1.getFieldName());//表單的name值
        System.out.println(file1.getFileName());//檔案名
        System.out.println(file1.getSize());//檔案大小
        System.out.println(file1.getFilePathName());//檔案原始路徑加檔案名
        System.out.println(file1.getFileExt());//檔案類型
        System.out.println("___________________________________");
        System.out.println("___________________________________");
        }
      } catch (Exception e) {
            e.printStackTrace();
            System.out.println("上傳失敗!");
            System.out.println(e.getMessage());
        }
           

(在Eclipse中,預設會把Web項目放到Eclipse的工作空間下的.metadata.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下)

在這裡可以找到你上傳成功的檔案

下載下傳

//超級簡單
String fileName = request.getParameter("fileName");
        SmartUpload su = new SmartUpload();//建立對象
        su.initialize(getServletConfig(), request, response);//初始化
        try {
            su.downloadFile("/images/"+fileName);//路徑加檔案名
            //su.setContentDisposition();
        } catch (SmartUploadException e) {
            e.printStackTrace();
        }
           

删除

String filePath = "/images/115049-106.jpg" ;//所在的項目路徑
        filePath = getServletContext().getRealPath(filePath);//擷取真正路徑
        System.out.println(filePath);
        // 在指定路徑下建立指定名稱的檔案
        File file = new File(filePath);//擷取檔案
        file.delete();//删除
           

注意:

1,在上傳的時候送出表單的時候如果input項有非file類型的,在servlet使用request的時候不能直接使用,而是要用su.getRequest()代替,su是SmartUpload對象,而且要在su初始化和調用upload()方法之後再使用。

2,在輸入路徑的時候,應用SmartUpload上傳儲存檔案的時候可以用相對于項目的路徑,如“/”+上傳檔案夾,而在建立檔案夾要用硬碟真實路徑,可以用getServletContext().getRealPath(filePath)獲得,filePath指上面的相對于項目的路徑。

3,不知道為什麼用ajax無法和SmartUpload相容,能通路servlet執行post方法但是執行SmartUpload的代碼時有問題,可能是我自己的問題

開頭部分參考資料:http://blog.51cto.com/12402717/1977293