Servlet實現檔案上傳
阿新 • • 發佈:2021-01-06
技術標籤:筆記
**要求:**實現圖片上傳(限制字尾以及圖片的大小,將圖片儲存到指定的伺服器中,地址儲存到資料庫中,最後在頁面中顯示出來)
實現步驟:
實現步驟:
1.關聯圖片上傳的jar包(commons-io.jar、commons-fileupload.jar),資料庫驅動包以及jstl相關的jar包(是否需要使用jstl)
2.定義表單,指定enctype屬性以及提交方式為post,同時給定input型別為file的表單
3.解析提交的表單資料(request)
a.建立一個DiskFileItemFactory物件,作為ServletFileupload物件的工廠
b.建立ServletFileupload物件,通過該物件去解析request物件,返回一個FileItem集合物件
c.每個FileItem中包含的就是表單中對應的鍵值對
d.判斷是否是檔案物件
加粗樣式>
4.擷取上傳的檔案的字尾與指定的字尾名進行匹配5.給上傳的檔案起個新名字以保證名字不衝突(UUID、時間戳等等)
6.將該過名字的檔案寫入到指定的伺服器的地址中
7.將檔案的地址寫入到資料庫中進行儲存
8.在前端的頁面中顯示上傳的圖片
前端新增頁面:
<c:if test="${not empty picSuffix}">
<p>只能上傳:${picSuffix}</p>
</c:if>
<c:if test ="${not empty sizeMsg}">
<p>${sizeMsg}</p>
</c:if>
<c:remove var="sizeMsg"/>
<c:remove var="picSuffix"/>
<form action="fileUploadServlet" enctype="multipart/form-data" method="post">
<input type="text" name="uname">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
後臺上傳圖片檔案程式碼
request.setCharacterEncoding("utf-8");
HttpSession session=request.getSession();
//建立一個讀取磁碟空間的工廠物件
FileItemFactory factory=new DiskFileItemFactory();
//通過工廠物件生產ServletFileUpload
ServletFileUpload fileUpload=new ServletFileUpload(factory);
try {
//設定可上傳的檔案大小
fileUpload.setSizeMax(1024*10);
//定義允許上傳的檔案字尾格式
String[] suffixArr={".jpg",".gif",".png",".jpeg"};
//解析request物件
List<FileItem> fileItemList=fileUpload.parseRequest(request);
//遍歷表單中的key val集合,拿到每一個具體的fileItem物件
for(FileItem fileItem:fileItemList){
//判斷當前的fileItem是普通的表單資料還是一個檔案上傳物件
if(fileItem.isFormField()){ //true代表是普通的表單資料
String fieldName=fileItem.getFieldName();
String fieldVal=fileItem.getString();
}else{//false代表是檔案上傳
String fieldName = fileItem.getFieldName();
//getName()獲取上傳的檔案的名字
String fieldVal = fileItem.getName();
//獲取上傳的檔案的字尾
//獲取最後一個點的下標
int lastIndex=fieldVal.lastIndexOf(".");
//擷取之後的部分
String suffix=fieldVal.substring(lastIndex);
//判斷獲取到的字尾是否在指定格式中
List<String> suffixList= Arrays.asList(suffixArr);
if (!suffixList.contains(suffix)){
session.setAttribute("picSuffix",suffixList);
resp.sendRedirect("index.jsp");
return;
}else{
//獲取伺服器中儲存圖片的資料夾地址 自己建立一個資料夾upload
String realPath=request.getRealPath("/upload");
//將圖片寫入到指定的伺服器地址中
File file=new File(realPath);
if (!file.exists()){
//如果檔案不存在就建立
file.mkdir();
}
//為檔案生成一個隨機的名字,保證名字不衝突(使用uuid生成)
String uuid= UUID.randomUUID().toString();
String fileName=uuid.replace("-","")+suffix;
File writeFile=new File(realPath,fileName);
fileItem.write(writeFile);
//將圖片的路徑儲存到資料庫中
String sql = "insert into t_item(pic) values(?)";
DBUtil.curd(sql,fileName);
//跳轉到顯示頁面
resp.sendRedirect("show_pic.jsp");
return;
}
}
}
} catch(SizeLimitExceededException e){
session.setAttribute("sizeMsg","可上傳的檔案大小:"+fileUpload.getFileSizeMax());
}
catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
前端展示程式碼
<%
String serverPath = request.getContextPath();
//圖片儲存路徑
String picPath = serverPath +"/upload/";
//獲取到資料庫中的圖片路徑集合
List<Picture> pictureList = new ArrayList<>();
Connection connection = DBUtil.newInstance();
String sql = "select * from t_item";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
ResultSet resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
Picture picture = new Picture();
picture.setId(resultSet.getInt(1));
picture.setPic(resultSet.getString(2));
pictureList.add(picture);
}
//存到域中
session.setAttribute("pictureList",pictureList);
%>
<c:forEach items="${pictureList}" var="picture">
<img src="<%=picPath%>${picture.pic}" alt="" width="300px" height="300px" border="1px">
</c:forEach>