**自己對於SSM文件上傳的一些心得**
剛開始的時候也是在網上尋找一些簡單的案例,可能我的這篇文章不是最好的,但是這些都是我自己慢慢的摸索以及自己的嘗試的一些心得,希望對各位有所幫助。
其實文件的上傳也不是特別的難,可能針對初學者來說是有一些難以理解,但是只要自己認真的分析一些,其實邏輯並不是特別的難。
首先做這個案例需要准備兩個jar,我用的是maven,具體依賴如下:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency>
上面兩個jar的依賴便是准備工作了,接下來便是上傳的頁面了,相信這個不會難倒小伙伴們,在此就直接把代碼給大家,不做過多的解釋了。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上傳下載</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/file/load"
method="post" enctype="multipart/form-data">
選擇文件:<input type="file" name="file" width="120px"> <input
type="submit" value="上傳">
</form>
</body>
</html>
多說一句<%@ page isELIgnored="false" %>這行代碼的作用便是讓瀏覽器解析jstl的代碼,有些小伙伴們編寫了jsp代碼運行的時候如果從session中取數據有可能就是不會解析,從而取不到自己想要的數據。
下面便是運行界面的效果圖
前面一些相信對於大家來說就是灑灑水了,關鍵的便是在控制層編寫相應的邏輯代碼了。
首先我們便是要得到文件的名稱
//獲取文件名稱 String fileName = file.getOriginalFilename();
獲得了文件的名稱之后,如果你需要給文件一個新的名稱可以使用UUID時間戳的方式給它一個新的名稱,案例中沒有使用,如果感興趣的話,我也把代碼給大家。
// 新文件名 String newFileName = UUID.randomUUID() + fileName;
得到了文件名稱后,便是需要解決上傳文件路徑的問題了,最簡單的便是自己設置一個絕對路徑,我在本案例中便是使用的絕對路徑具體代碼如下:
//設置上傳路徑 String path = "D:/test1/";
若是想要放在項目路徑下的話只需要修改自己相應的代碼即可:
// 獲得項目的路徑 ServletContext sc = request.getSession().getServletContext(); // 上傳位置 String path = sc.getRealPath("/files") + "/"; // 設定文件保存的目錄
注意:在你路徑下必須是“/”結尾,若是沒有這個"/"到時候效果可能不會如你所想,想要實驗的小伙伴們可以去試一試,在這里我便不演示了。
接下來的便是文件上傳的核心了:文件上傳主要是利用了流的思想。流便是:輸入流和輸出流(不要怪我啰嗦,主要是讓一些不太清楚的小伙伴們理解,大神忽略即可)。
首先是判斷下自己所設置的路徑是否存在,如果沒有判斷的話,要是路徑不存在,那么你的后台便會報錯,具體的錯誤那就靠各位小伙伴們自己去嘗試了,我就不在這里演示了,你只有自己嘗試才會更加的注意這個問題,等下次報了相同的異常的時候自己就知道如何去解決。具體代碼如下:
//文件上傳 File f = new File(path); //判斷路徑是否存在,不存在則創建 if(!f.exists()){ f.mkdirs(); }
f.exists是一個判斷這個路徑是否存在的,返回的結果是一個Boolean值,如果存在返回true不存在則但會false,!便是對其取反,(就是原來是true的變成false,false變成true);f.mkdirs();便是創建對應文件。如果文件位置不存在的話,f.exists便是false ,然后對其取反便為true便會執行if里面的語句,從而創建對應的文件路徑。
接下來便是處理文件上傳了。
//判斷上傳文件是否為空 if(!file.isEmpty()){ try { FileOutputStream fos = new FileOutputStream(path + fileName); InputStream in = file.getInputStream(); int a = 0; if((a = in.read())!=-1){ fos.write(a); } in.close(); fos.close(); }catch (Exception e){ e.printStackTrace(); } }
首先便是判斷下用戶上傳的文件是否為空(就是用戶是否上傳了文件),若是你文件都沒有選擇便點擊上傳的話我們后台也沒有必要去處理他了吧。
用戶上傳文件之后
這行代碼就是開啟一個輸出流,輸出的路徑便是之前我們設置的路徑,注意的是這里需要處理一下異常,我這里是直接捕獲一個最大的異常。
FileOutputStream fos = new FileOutputStream(path + fileName);
這個便是得到上傳文件的輸入流
InputStream in = file.getInputStream();
下面的代碼是通過一個變量a來接收輸入流,一邊讀,然后輸出流一邊的寫出去,當讀完之后變量a的值便為-1,所以這便成了一個判斷的依據,當變量a為-1的時候也就代表已經讀完了,而且同時也寫完了
int a = 0; if((a = in.read())!=-1){ fos.write(a); }
當讀完之后小伙伴們記得把輸入流和輸出流關閉哦,如果不關閉的話會造成資源浪費的,而且還需注意的是大家要按照先開后關的原則哦。
in.close();
fos.close();
接下來的便是完整的代碼。
@Controller @RequestMapping("/file") public class File2Controller { @PostMapping("/load") public String fileload(MultipartFile file, HttpServletRequest request) { //獲取文件名稱 String fileName = file.getOriginalFilename(); //設置上傳路徑 String path = "D:/test1/"; //文件上傳 File f = new File(path); //判斷路徑是否存在,不存在則創建 if(!f.exists()){ f.mkdirs(); } //判斷上傳文件是否為空 if(!file.isEmpty()){ try { FileOutputStream fos = new FileOutputStream(path + fileName); InputStream in = file.getInputStream(); int a = 0; if((a = in.read())!=-1){ fos.write(a); } in.close(); fos.close(); }catch (Exception e){ e.printStackTrace(); } } return null; } }
效果圖如下:
以上便是個人對於文件上傳的一些心得,可能寫的不是特別的好,只是希望對小伙伴們有一些幫助,特別是對於一些萌新們,只希望能夠幫助你們就好。(最后希望大神們勿噴)
