閑言少敘,直入主題。
/**
* @throws IOException
*
* @category 上傳文檔
* @Title: uploadImage
* @Description:
* @return void 返回類型
* @throws
*/
protected int uploadFile(HttpServletRequest request, HttpServletResponse response, String saveFilename) {
int size = 1024 * 1024 * 2;
try {
// 上傳時生成的文件保存目錄
String realSavePath = sp.makePath(saveFilename, sp.getFileSaveRootPath());
// 上傳時生成的臨時文件保存目錄
String tempPath = this.getServletContext().getRealPath(sp.getTemp_Path());
File tmpFile = new File(tempPath);
if (!tmpFile.exists()) {
// 創建臨時目錄當前已處理
tmpFile.mkdir();
}
//sp.makePath(savePath);
InputStream in = new BufferedInputStream(new DataInputStream(request.getInputStream()), size);
OutputStream out = new BufferedOutputStream(new FileOutputStream(realSavePath ), size);
byte buffer[] = new byte[1024];
// 判斷輸入流中的數據是否已經讀完的標識
int len = 0;
// 循環將輸入流讀入到緩沖區當中,(len=in.read(buffer))>0就表示in里面還有數據
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream輸出流將緩沖區的數據寫入到指定的目錄(savePath + "\\"
// +filename)當
out.write(buffer, 0, len);
}
// 關閉輸入流
in.close();
// 關閉輸出流
out.close();
return 1;
} catch (IOException e) {
System.out.println("io操作異常");
e.printStackTrace();
return 0;
}
}
注:
saveFilename :是文件名,用於存儲到數據庫中,便於索引文件。
sp.getFileSaveRootPath():是文件存儲地址,存儲地址這塊遇到一些問題下面會提到。
sp.getTemp_Path()) :當文件過大時,緩存路徑。
文件上傳時遇到了幾個問題以及解決的辦法:
問題一:文件地址存儲問題。
其一 以存儲到相對路徑中,一般都是這么搞,所謂相對路徑,在這里一般是相對系統的發布路徑,也就是說,如果是web項目,tomcat/ebapp文件夾,這目錄下會相對存在一個與項目同名的文件夾, 存放項目發布后的資源,上傳文檔的路徑也是以此為根目錄的,但是也有人認為是以Root為根目錄,對此不太明白,望各位走過路過的大神稍微指點指點。
在這里會遇到一個問題:就是每次重新編譯項目,就會出現原來上傳的資源消失了的現象,其實這是必然的現象,因為說是更新,其實仔細查看Tomcat的啟動流程就會發現,它是先刪除原來編譯的項目文件,然后再重新編譯現在的文件,會出現資源的消失也是必然的。由此引出了下面的解決思路。
其二 可以存儲到盤中的任意路徑中,這就需要用到Tomcat的一個虛擬存儲技術。
所謂虛擬存儲,是指將Tomcat下一個虛擬路徑,映射到磁盤中的實際路徑中去。
實現方式一般有兩種,
方式一 tomcat安裝目錄下conf/servlet.xml中 <HOST>標簽下配置
<Context path="/demo" docBase="E:\demo" />
方式二 在conf\Catalina\localhost中添加文件名為test.xml
內容為 <?xml version="1.0" encoding="UTF-8"?>
<Context crossContext="true" docBase="D:\SavePhotos" reloadable="true"/>
即可實現文件的上傳。這是項目部署之后的實現方式
如果項目還在本地,一般都會有項目名,那么只需修改文件名為 文件名#test.xml 即可。
問題二。文件名問題。
問題三。文件名后綴問題。