姹熻嫃cba璧涚▼ :JSP+Servlet實現文件上傳到服務器功能

cba广东队赛程 www.axwwg.com  更新時間:2020-01-15 15:59:34   作者:佚名   我要評論(0)

本文實例為大家分享了JSP+Servlet實現文件上傳到服務器功能的具體代碼,供大家參考,具體內容如下


項目目錄結構大致如下:

正如我在上圖紅線畫的三個東西:Dao、

本文實例為大家分享了JSP+Servlet實現文件上傳到服務器功能的具體代碼,供大家參考,具體內容如下

項目目錄結構大致如下:

正如我在上圖紅線畫的三個東西:Dao、service、servlet 這三層是主要的結構,類似 MVC 架構,Dao是模型實體類(邏輯層),service是服務層,servlet是視圖層,三者協作共同完成項目。

這里的User是由user表來定義的一個類,再封裝增刪改查等操作,實現從數據庫查詢與插入,修改與刪除等操作,并實現了分頁操作,也實現了將圖片放到服務器上運行的效果。

Dao層:主要實現了User類的定義,接口IUserDao的定義與實現(UserDaoImpl);

service層:直接定義一個接口類IUserService,與IUserDao相似,再實現其接口類UserServiceImpl,直接實例化UserDaoImpl再調用其方法來實現自己的方法,重用了代碼。詳見代碼吧;

servlet層:起初是將表User 的每個操作方法都定義成一個servlet 去實現,雖然簡單,但是太多了,不好管理,于是利用 基類BaseServlet 實現了“反射機制”,通過獲取的 action 參數自己智能地調用對應的方法,而UserServlet則具體實現自己的方法,以供調用,方便許多,詳見之前的博文或下述代碼。

將文件上傳到 tomcat 服務器的編譯后運行的過程的某個文件關鍵要在每次編譯后手動為其創建該文件夾來存放相應的上傳文件,否則會導致每次重啟 tomcat 服務器后該編譯后的工程覆蓋了原先的,導致上傳文件存放的文件夾不存在,導致代碼找不到該文件夾而報錯,即上傳不成功。如下圖所示:

主要是考慮圖片路徑的問題,手工設置路徑肯定不能保證不重復,所以取到上傳圖片的后綴名后利用隨機生成的隨機數作為圖片名,這樣就不會重復名字了:

String extendedName = picturePath.substring(picturePath.lastIndexOf("."),// 截取從最后一個'.'到字符串結束的子串。
 picturePath.length());
 // 把文件名稱重命名為全球唯一的文件名
 String uniqueName = UUID.randomUUID().toString();
 saveFileName = uniqueName + extendedName;// 拼接路徑名

增加用戶時代碼如下:

 // 增
 public void add(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 System.out.println("add方法被調用");
 // 獲取數據
 int id = 0;
 String username = null;
 String password = null;
 String sex = null;
 Date birthday = null;
 String address = null;
 String saveFileName = null;
 String picturePath = null;
 // 得到表單是否以enctype="multipart/form-data"方式提交
 boolean isMulti = ServletFileUpload.isMultipartContent(request);
 if (isMulti) {
 // 通過FileItemFactory得到文件上傳的對象
 FileItemFactory fif = new DiskFileItemFactory();
 ServletFileUpload upload = new ServletFileUpload(fif);
 
 try {
 List<FileItem> items = upload.parseRequest(request);
 for (FileItem item : items) {
 // 判斷是否是普通表單控件,或者是文件上傳表單控件
 boolean isForm = item.isFormField();
 if (isForm) {// 是普通表單控件
 String name = item.getFieldName();
 if ("id".equals(name)) {
 id = Integer.parseInt(item.getString("utf-8"));
 System.out.println(id);
 }
 if ("sex".equals(name)) {
 sex = item.getString("utf-8");
 System.out.println(sex);
 }
 if ("username".equals(name)) {
 username = item.getString("utf-8");
 System.out.println(username);
 }
 if ("password".equals(name)) {
 password = item.getString("utf-8");
 System.out.println(password);
 }
 if ("birthday".equals(name)) {
 String birthdayStr = item.getString("utf-8");
 SimpleDateFormat sdf = new SimpleDateFormat(
  "yyyy-MM-dd");
 try {
 birthday = sdf.parse(birthdayStr);
 } catch (ParseException e) {
 e.printStackTrace();
 }
 System.out.println(birthday);
 }
 if ("address".equals(name)) {
 address = item.getString("utf-8");
 System.out.println(address);
 }
 if ("picturePath".equals(name)) {
 picturePath = item.getString("utf-8");
 System.out.println(picturePath);
 }
 } else {// 是文件上傳表單控件
 // 得到文件名 xxx.jpg
 String sourceFileName = item.getName();
 // 得到文件名的擴展名:.jpg
 String extendedName = sourceFileName.substring(
 sourceFileName.lastIndexOf("."),
 sourceFileName.length());
 // 把文件名稱重命名為全球唯一的文件名
 String uniqueName = UUID.randomUUID().toString();
 saveFileName = uniqueName + extendedName;
 // 得到上傳到服務器上的文件路徑
 // C:\\apache-tomcat-7.0.47\\webapps\\taobaoServlet4\\upload\\xx.jpg
 String uploadFilePath = request.getSession()
 .getServletContext().getRealPath("upload/");
 File saveFile = new File(uploadFilePath, saveFileName);
 // 把保存的文件寫出到服務器硬盤上
 try {
 item.write(saveFile);
 } catch (Exception e) {
 e.printStackTrace();
 }
 }
 }
 } catch (NumberFormatException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 } catch (FileUploadException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
 // 2、封裝數據
 User user = new User(id, username, password, sex, birthday, address,
 saveFileName);
 // 3、調用邏輯層API
 IUserService iUserService = new UserServiceImpl();
 // 4、控制跳轉
 HttpSession session = request.getSession();
 if (iUserService.save(user) > 0) {
 System.out.println("添加新用戶成功!");
 List<User> users = new ArrayList<User>();
 users = iUserService.listAll();
 session.setAttribute("users", users);
 response.sendRedirect("UserServlet?action=getPage");
 } else {
 System.out.println("添加新用戶失敗!");
 PrintWriter out = response.getWriter();
 out.print("<script type='text/javascript'>");
 out.print("alert('添加新用戶失敗!請重試!');");
 out.print("</script>");
 }
 }

修改用戶時注意考慮圖片更改和沒更改這兩種情況,圖片更改時要先獲取原圖片并刪除其在服務器上的圖片,再添加新圖片到服務器;圖片不更改時則無需更新圖片路徑。

 // 改
 public void update(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 System.out.println("update方法被調用");
 HttpSession session = request.getSession();
 // 獲取數據
 int id = (int)session.getAttribute("id");
 String username = null;
 String password = null;
 String sex = null;
 Date birthday = null;
 String address = null;
 String saveFileName = null;
 String picturePath = null;
 IUserService iUserService = new UserServiceImpl();
 // 得到表單是否以enctype="multipart/form-data"方式提交
 boolean isMulti = ServletFileUpload.isMultipartContent(request);
 if (isMulti) {
 // 通過FileItemFactory得到文件上傳的對象
 FileItemFactory fif = new DiskFileItemFactory();
 ServletFileUpload upload = new ServletFileUpload(fif);
 try {
 List<FileItem> items = upload.parseRequest(request);
 for (FileItem item : items) {
 // 判斷是否是普通表單控件,或者是文件上傳表單控件
 boolean isForm = item.isFormField();
 if (isForm) {// 是普通表單控件
 String name = item.getFieldName();
 if ("sex".equals(name)) {
 sex = item.getString("utf-8");
 System.out.println(sex);
 }
 if ("username".equals(name)) {
 username = item.getString("utf-8");
 System.out.println(username);
 }
 if ("password".equals(name)) {
 password = item.getString("utf-8");
 System.out.println(password);
 }
 if ("birthday".equals(name)) {
 String birthdayStr = item.getString("utf-8");
 SimpleDateFormat sdf = new SimpleDateFormat(
  "yyyy-MM-dd");
 try {
 birthday = sdf.parse(birthdayStr);
 } catch (ParseException e) {
 e.printStackTrace();
 }
 System.out.println(birthday);
 }
 if ("address".equals(name)) {
 address = item.getString("utf-8");
 System.out.println(address);
 }
 if ("picturePath".equals(name)) {
 picturePath = item.getString("utf-8");
 System.out.println(picturePath);
 }
 } else {// 是文件上傳表單控件
 // 得到文件名 xxx.jpg
 picturePath = item.getName();
 if (picturePath != "") {// 有選擇要上傳的圖片
 // 得到文件名的擴展名:.jpg
 String extendedName = picturePath.substring(
  picturePath.lastIndexOf("."),// 截取從最后一個'.'到字符串結束的子串。
  picturePath.length());
 // 把文件名稱重命名為全球唯一的文件名
 String uniqueName = UUID.randomUUID().toString();
 saveFileName = uniqueName + extendedName;// 拼接路徑名
 // 得到上傳到服務器上的文件路徑
 // C:\\apache-tomcat-7.0.47\\webapps\\CommonhelloWorldServlet\\upload\\xx.jpg
 String uploadFilePath = request.getSession()
  .getServletContext().getRealPath("upload/");
 File saveFile = new File(uploadFilePath,
  saveFileName);
 // 把保存的文件寫出到服務器硬盤上
 try {
 item.write(saveFile);
 } catch (Exception e) {
 e.printStackTrace();
 }
 // 3、調用邏輯層 API
 // 根據id查詢用戶并獲取其之前的圖片
 User user = iUserService.getUserById(id);
 String oldPic = user.getPicturePath();
 String oldPicPath = uploadFilePath + "\\" + oldPic;
 File oldPicTodelete = new File(oldPicPath);
 oldPicTodelete.delete();// 刪除舊圖片
 }
 }
 }
 } catch (NumberFormatException e) {
 e.printStackTrace();
 } catch (FileUploadException e) {
 e.printStackTrace();
 }
 }
 System.out.println(id + "\t" + username + "\t" + password + "\t" + sex
 + "\t" + address + "\t" + picturePath + "\t" + birthday);
 
 // 2、封裝數據
 User user = new User(id, username, password, sex, birthday, address,
 saveFileName);
 
 if (iUserService.update(user) > 0) {
 System.out.println("修改數據成功!");
 List<User> users = new ArrayList<User>();
 users = iUserService.listAll();
 session.setAttribute("users", users);
 // 4、控制跳轉
 response.sendRedirect("UserServlet?action=getPage");
 } else {
 System.out.println("修改數據失敗!");
 PrintWriter out = response.getWriter();
 out.print("<script type='text/javascript'>");
 out.print("alert('修改數據失敗!請重試!');");
 out.print("</script>");
 }
 }

刪除的話就比較簡單了,直接獲取原圖片路徑并刪除,則原圖片在服務器上被刪除。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • Jsp+Servlet實現文件上傳下載 刪除上傳文件(三)
  • Jsp+Servlet實現文件上傳下載 文件列表展示(二)
  • Jsp+Servlet實現文件上傳下載 文件上傳(一)
  • JSP servlet實現文件上傳下載和刪除
  • jsp+servlet實現文件上傳與下載功能
  • servlet+JSP+mysql實現文件上傳的方法

相關文章

  • JSP+Servlet實現文件上傳到服務器功能

    JSP+Servlet實現文件上傳到服務器功能

    本文實例為大家分享了JSP+Servlet實現文件上傳到服務器功能的具體代碼,供大家參考,具體內容如下 項目目錄結構大致如下: 正如我在上圖紅線畫的三個東西:Dao、
    2020-01-15
  • 正則表達式(RegExp)判斷文本框中是否包含特殊符號

    正則表達式(RegExp)判斷文本框中是否包含特殊符號

    前言 有時,我們希望判斷文本框中用戶輸入的字符是否含有特殊符號(*/#[email protected]),就像用戶注冊時密碼框的填寫。 demo 利用 RegExp 對象,能很優雅的實現以上需求: // e
    2020-01-15
  • JSP實現分頁效果

    JSP實現分頁效果

    本文實例為大家分享了JSP實現分頁的具體代碼,供大家參考,具體內容如下 咱們在瀏覽網頁的時候,當一個頁面的數據不足以展示完全所有的內容,一般都涉及到分頁,下一
    2020-01-15
  • JS正則(RegExp)判斷文本框中是否包含特殊符號

    JS正則(RegExp)判斷文本框中是否包含特殊符號

    前言 有時,我們希望判斷文本框中用戶輸入的字符是否含有特殊符號(*/#[email protected]),就像用戶注冊時密碼框的填寫。 demo 利用 RegExp 對象,能很優雅的實現以上需求: // e
    2020-01-15
  • UNIX/LINUX SHELL 正則表達式語法詳解附使用方法

    UNIX/LINUX SHELL 正則表達式語法詳解附使用方法

    幾乎所有重要問題都需要從無用數據中過濾出有用數據。了解大量的 UNIX&#63; 命令行實用工具如何使用正則表達式 來去蕪取精。 非常奇怪,直到今天我仍然能重復周六
    2020-01-15
  • jsp filter 過濾器功能與簡單用法示例

    jsp filter 過濾器功能與簡單用法示例

    本文實例講述了jsp filter 過濾器功能與簡單用法。分享給大家供大家參考,具體如下: 過濾器的作用是什么&#63; 過濾器可以動態地攔截請求和響應,以變換或使用包含在
    2020-01-15
  • jsp 實現的簡易mvc模式示例

    jsp 實現的簡易mvc模式示例

    本文實例講述了jsp 實現的簡易mvc模式。分享給大家供大家參考,具體如下: jsp : java servlet page MVC全名是Model View Controller,是模型(model)-視圖(view)-
    2020-01-15
  • 解決正則表示式匹配($regex)引起的一次mongo數據庫cpu占用率高的問題

    解決正則表示式匹配($regex)引起的一次mongo數據庫cpu占用率高的問題

    某一天,監控到mongo數據庫cpu使用率高了很多,查了一下,發現是下面這種語句引起的: db.example_collection.find({ "idField" : { "$regex" : "1234567890123
    2020-01-15
  • 愛站因侵權問題 被迫關閉

    愛站因侵權問題 被迫關閉

    2020年1月9日知名站長工具愛站網出現了“網站維護中,請稍后訪問”,初始很多網友都以為是愛站網臨時升級系統導致的,截止今天(2020年1月12日)還沒有恢復,目前愛站網官方
    2020-01-13
  • es6 for循環中let和var區別詳解

    es6 for循環中let和var區別詳解

    let和var區別: for(var i=0;i<5;i++){ setTimeout(()=>{ console.log(i);//5個5 },100) } console.log(i);//5 console.log('=============') for(let
    2020-01-12

最新評論