SSM項目中實現文件上傳並保存到本地文件夾中

1. 前言

         之前使用Servlet實現文件(圖片)上傳,並將圖片保存到當前項目的路徑下,在頁面通過img標籤將圖片顯示。但這會出現一個問題:把Tomcat服務器停止後,再啓動,就會發現之前上傳到Tomcat中的圖片全消失了。這是因爲再次啓動Tomcat時,Tomcat會重新部署此項目,那麼之前的項目會被覆蓋掉,所以,上傳的文件會消失,在頁面的img標籤中不能訪問。
         所以,把需要上傳的文件不能保存到此項目下,可以保存到其他路徑/磁盤下,即使,Tomcat重啓那也不會影響到上傳的文件。在真實的項目開發中,公司會有專門的文件服務器進行存儲圖片。
        由於自己在做畢設時,在上傳文件這塊碰了很多壁,所以,稍加記錄一下。這裏,我就在畢設項目中進行演示。在原項目中添加了兩個Jsp文件—test.jsp和success.jsp

2. DEMO功能描述

在瀏覽器中輸入:http://localhost:8080/test,跳轉到test.jsp頁面。test.jsp頁面就是一個表單提交信息—添加酒店:

  • 填寫酒店相應信息,並上傳酒店的圖片。上傳成功後會往數據庫添加一條數據,也會存儲圖片的名稱
  • 跳轉到success.jsp,從數據庫讀取酒店的圖片路徑,並顯示。

3. DEMO技術棧

3.1 後臺技術棧

.開發工具:IDEA2018
.開發框架:SSM
.包管理工具:MAVEN

4. DEMO開發流程

在這裏插入圖片描述
IndexController

@Controller
public class IndexController {
    @RequestMapping(value = "/test")
    public String test() {
        return "test";
    }
}

跳轉到test.jsp頁面

test.jsp

<body>
<form action="${pageContext.request.contextPath }/addHotel" method="post" enctype="multipart/form-data">
    酒店名稱:<input type="text" placeholder="酒店名稱" name="name" /><br>
    酒店圖片:<input type="file" name="HotelImage"/><br>
    <input type="submit" value="提交" />
</form>
</body>

【注意】:

  1. enctype=“multipart/form-data”
  2. 輸入框中的name="HotelImage"要與後臺的MultipartFile 類型的屬性名一致,且不要和實體類Hotel中表示圖片的屬性名相同

addHotel控制器
這裏使用了springmvc技術的文件上傳,所以別忘了,要在springmvc.xml中配置文件上傳

@RequestMapping("/addHotel")
public String addHotel(Hotel hotel, MultipartFile HotelImage, Model model) {
    if (HotelImage.getSize() != 0) {
        String path = "E:/workspace/project/upload";
        String imageName = UploadUtil.upload(HotelImage,path);
        hotel.setPic(imageName);
    }
    hotelService.addHotel(hotel);
    model.addAttribute("hotel", hotel);
    return "success";
}

這裏的path= “E:/workspace/project/upload” 就是要保存圖片的目錄(用戶可自定義)。即:上傳的圖片都存儲在這個文件夾中。

也在數據庫中存儲了酒店圖片的路徑(圖片名稱):
在這裏插入圖片描述

upload()

public class UploadUtil {
	public static String upload(MultipartFile file, String basePath) {
		String uuid = UUID.randomUUID().toString();
		String orgFileName = file.getOriginalFilename();
		String ext= "." + FilenameUtils.getExtension(orgFileName);
		String fileName = uuid + ext;
		try {
			File targetFile = new File(basePath, fileName);
			FileUtils.writeByteArrayToFile(targetFile, file.getBytes());
			return fileName;

		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}
}

這裏是使用了FileUtils.writeByteArrayToFile()進行保存圖片。

配置虛擬目錄

還需要配置虛擬目錄,這樣才能在頁面中訪問,這裏有兩種方法。
想了解詳情,請查看 這篇博客

法1:修改tomcat中的server.xml

設置Tomcat的安裝目錄下E:\Tomcat8\conf\server.xml文件中“host”標籤中添加配置:

<Context path="/upload" docBase="E:/workspace/project/upload" crossContext="true" reloadable="true" debug="0"/>

path:虛擬路徑
docBase:保存圖片的絕對地址

什麼意思呢?
舉例:
在這裏插入圖片描述
訪問docBase指向的文件夾下的一張圖片1.jpg,則這樣訪問:localhost:8080/upload/1.jpg

訪問路徑前需要添加“upload”

法2:使用IDEA工具
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
選擇需要保存圖片的目錄
在這裏插入圖片描述
添加虛擬目錄

success.jsp

<body>
    <img src="/upload/${hotel.pic}" />
</body>

訪問前添加“upload”

配置了虛擬目錄後,無論Tomcat重啓多少次後,還是可以訪問上傳後的圖片的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章