前言
項目中,須要上傳文件,可是可能會比較多,因此不能放入項目目錄中,須要指定目錄並按順序放置。而且:還須要這些數據能夠預覽(圖片等)。數據庫
那麼問題就是:上傳完成以後我存入服務器,並拿到絕對路徑,存入數據庫,那麼,前臺訪問的時候請求地址確定是:ip+端口+項目名,那麼該如何獲取資源呢?tomcat
正文:
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 這個路徑,也就實現了咱們訪問相對路徑映射到絕對路徑上去。ide
須要注意的是:若是文件名是中文名,爲了不亂碼,請在Connector標籤內添加URIEncoding=「UTF-8」 進行編碼集設置。測試
3. 測試
咱們在文件絕對路徑下放置一個圖片:編碼
當咱們上傳完成以後,獲得的路徑是: D:\file\picture\20180828083720.png。那麼咱們存入數據庫這張圖片的路徑是什麼呢??spa
若是存入: D:\file\picture\20180828083720.png,那麼你確定是訪問不到的,由於請求的路徑確定是 http://xxx.xxx.xx.xx:8080/xxx/xxx.png,這樣的路徑確定沒法訪問絕對路徑,因此咱們必需要映射虛擬路徑。3d
映射完以後,直接在網址上輸入:http://localhost:8080/file/fileUpload/20180828083720.png,那麼默認訪問的就是http://localhost:8080 這臺電腦下的 D:\file\picture下的20180828083720.png。是能夠訪問到的,以下:rest
因而可知是能夠訪問到的。若是咱們在網頁中呢?只須要將src設置爲虛擬路徑,而後加上文件名便可。code
因此:若是咱們要存儲路徑的時候,就須要將絕對路徑更改成相對路徑,而後存入數據庫,當咱們前臺拿到路徑以後訪問,映射的就是絕對路徑。