1. 程式人生 > >用form表單提交方式上傳圖片到伺服器

用form表單提交方式上傳圖片到伺服器

springMVC為檔案上傳提供了直接的支援,這種支援是通過MultipartResolver實現的,實現類為CommonsMultipartResovler.

依賴:commons-fileupload-1.2.jar     commons-io-1.3.2.jar

普通的檔案上傳:

1.配置虛擬目錄

在eclipse中的Tomcat中配置圖片虛擬目錄(模擬圖片伺服器),訪問http://localhost:8080/pic/xxx.jpg即可訪問到虛擬目錄(圖片伺服器)下的圖片。

如下圖:

 

複製一張圖片到存放圖片的資料夾,使用瀏覽器訪問

測試效果,如下圖:

 

2.加入jar包

實現圖片上傳需要加入的jar包,如下圖:

下載地址:https://download.csdn.net/download/weixin_39556885/9928690

https://download.csdn.net/download/huoniuyi1230/10111679

把兩個jar包放到工程的lib資料夾中

 

3.配置上傳解析器

在springmvc.xml中配置檔案上傳解析器

<!-- 檔案上傳,id必須設定為multipartResolver -->

<

bean id="multipartResolver"

class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <!-- UTF-8必須和pageEncoding屬性一直 -->

    <property name="defaultEncoding" value="UTF-8" />

    <!-- 設定檔案上傳大小 -->

    <

property name="maxUploadSize" value="5000000" />

</bean>

4.jsp頁面修改

必須將表單的method設定為POST,並將enctype設定為multipart/form-data。只有在這樣的情況下,瀏覽器才會把使用者選擇的檔案以二進位制資料傳送給伺服器。

 

enctype="multipart/form-data"

 

5.圖片上傳

在更新商品方法中新增圖片上傳邏輯 controller

/**

 * 更新商品

 * @param item

 * @return

 * @throws Exception

 */

@RequestMapping("updateItem")

public String updateItemById(Item item, MultipartFile pictureFile) throws Exception {

    // 設定圖片名稱,不能重複,可以使用uuid

    String picName = UUID.randomUUID().toString();

    // 獲取檔名

    String oriName = pictureFile.getOriginalFilename();

    // 獲取圖片字尾

    String extName = oriName.substring(oriName.lastIndexOf("."));

    // 開始上傳

    pictureFile.transferTo(new File("C:/upload/image/" + picName + extName));

    // 設定圖片名到商品中

    item.setPic(picName + extName);

    // ---------------------------------------------

    // 更新商品

    this.itemService.updateItemById(item);

    return "forward:/itemEdit.action";

}

效果,如下圖:

 

ajax檔案上傳:

如果form表單的資料大,form表單和圖片一起上傳,會相互影響,降低上傳的效率,因此我們可以把圖片做成非同步上傳。

1.jsp:

2.controller:

MultipartFile物件的常用方法:

  • byte[] getBytes():獲取檔案資料
  • String getContentType[]:獲取檔案MIME型別,如image/jpeg等
  • InputStream getInputStream():獲取檔案流
  • String getName():獲取表單中檔案元件的名字
  • String getOriginalFilename():獲取上傳檔案的原名
  • Long getSize():獲取檔案的位元組大小,單位為byte
  • boolean isEmpty():是否有上傳檔案
  • void transferTo(File dest):將上傳檔案儲存到一個目錄檔案中

檔案型別有:

圖片:image/jpeg

           image/png

           image/gif

txt:text/plain

ppt:application/vnd.ms-powerpoint

excel:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

word:application/vnd.openxmlformats-officedocument.wordprocessingml.document

可以根據檔案型別和檔案大小限制上傳檔案的型別和大小: