前言
項目中,需要上傳文件,但是可能會比較多,所以不能放入項目目錄中,需要指定目錄並按順序放置。並且:還需要這些數據可以預覽(圖片等)。
那么問題就是:上傳完成之后我存入服務器,並拿到絕對路徑,存入數據庫,那么,前台訪問的時候請求地址肯定是:ip+端口+項目名,那么該如何獲取資源呢?
正文:
1. 文件上傳到指定目錄(服務器絕對路徑,按天存放)

if (file.isEmpty()){ logger.error("文件為空"); } String filename = file.getOriginalFilename(); //校驗文件名 String contentType = file.getContentType(); //校驗文件類型 long size = file.getSize(); //校驗文件大小 logger.info("文件名:{},文件的類型:{},文件的大小:{}", filename,contentType,size); try { //restorePath存儲目錄,在配置文件中存儲,通過@value拿到。 File parentPath = new File(restorePath + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE)); if (!parentPath.exists()){ parentPath.mkdir(); //判斷父路徑是否存在,不存在就創建出來 } File newFile = new File(parentPath , filename); file.transferTo(newFile); //復制文件 String resultPath = newFile.getPath(); logger.info("上傳文成,文件路徑為:" + resultPath); } catch (IOException e) { e.printStackTrace(); }
2. 在tomcat中配置虛擬路徑,指向配置的絕對路徑。
有這么一種方案:在tomcat中,我們可以配置一個虛擬路徑,當訪問指定虛擬路徑的時候,就訪問我們指定的那么路徑,這樣就可以映射相對路徑到絕對路徑上去。如下:
<Context path="/file/fileUpload" docBase="D:\file\picture" reloadable="true"></Context>
當我們訪問 localhost:8080//file/fileUpload 的時候,我們會默認訪問 D:\file\picture 這個路徑,也就實現了我們訪問相對路徑映射到絕對路徑上去。
需要注意的是:如果文件名是中文名,為了避免亂碼,請在Connector標簽內添加URIEncoding=“UTF-8” 進行編碼集設置。
3. 測試
我們在文件絕對路徑下放置一個圖片:
當我們上傳完成之后,得到的路徑是: D:\file\picture\20180828083720.png。那么我們存入數據庫這張圖片的路徑是什么呢??
如果存入: D:\file\picture\20180828083720.png,那么你肯定是訪問不到的,因為請求的路徑肯定是 http://xxx.xxx.xx.xx:8080/xxx/xxx.png,這樣的路徑肯定無法訪問絕對路徑,所以我們必須要映射虛擬路徑。
映射完之后,直接在網址上輸入:http://localhost:8080/file/fileUpload/20180828083720.png,那么默認訪問的就是http://localhost:8080 這台電腦下的 D:\file\picture下的20180828083720.png。是可以訪問到的,如下:
由此可見是可以訪問到的。如果我們在網頁中呢?只需要將src設置為虛擬路徑,然后加上文件名即可。
所以:如果我們要存儲路徑的時候,就需要將絕對路徑更改為相對路徑,然后存入數據庫,當我們前台拿到路徑之后訪問,映射的就是絕對路徑。