jsp+servlet+Mysql 存儲圖片路徑到數據庫

實現思路:

存:在進行上傳圖片時,爲了防止圖片名重複先使用時間戳對圖片名進行重命名,然後再把圖片放在Web項目路徑下,最後把圖片的路徑存放在數據庫中。
取:從數據庫中取出相應的圖片路徑,回顯到前端頁面

工具:
  • IDEA
  • Mysql
  • fileUpload

實現步驟

1:導入依賴jar包
  • commons-fileUpload.jar
  • commons-io.jar

使用fileUpload組件首先需要引入的·兩個jar包

2:數據庫操作準備
  • 創建用戶表
-- 創建用戶表
CREATE TABLE blogger(
	blogger_id INT PRIMARY KEY auto_increment,
	name_id VARCHAR(50) NOT NULL UNIQUE,
	nick_name VARCHAR(50) NOT NULL UNIQUE,
	gender TINYINT,
	header_por VARCHAR(80)
)

存儲圖片的字段(header_por)類型是字符型,用來存儲圖片路徑

  • 用戶表實體映射
    Blogger.java
public class Blogger {
    private int blogger_id;
    private String name_id;
    private String nick_name;
    private Integer gender;
    private String header_por;
    private String email;
    private String brief_intro;
    private String pass;
    private int state;
    private String active_code;
    private Integer expire_time;

    public int getBlogger_id() {
        return blogger_id;
    }

    public void setBlogger_id(int blogger_id) {
        this.blogger_id = blogger_id;
    }

    public String getName_id() {
        return name_id;
    }

    public void setName_id(String name_id) {
        this.name_id = name_id;
    }

    public String getNick_name() {
        return nick_name;
    }

    public void setNick_name(String nick_name) {
        this.nick_name = nick_name;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public String getHeader_por() {
        return header_por;
    }

    public void setHeader_por(String header_por) {
        this.header_por = header_por;
    }
    }
}

  • Dao層操作數據庫存貯圖片路徑
    bloggerDao.java
public class BloggerDao {
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
	// 修改頭像
    public int updateHead(int id,String headUrl) {
        String sql = "update blogger set header_por = ? where blogger_id = ?";
        int n = template.update(sql,headUrl,id);
        return n;
    }
}

3:servlet編寫
@WebServlet("/uploadImageServlet")
public class UploadImageServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        Object file = request.getParameter("file");
        Blogger blogger = (Blogger) session.getAttribute("blogger");//獲取到登錄時存入session裏的用戶對象
        String headUrl = "";  //存放頭像圖片路徑
        String headImgFileName = "headImage";  //Web項目中存放圖片的文件夾名。可自定義
        // 判斷上傳表單是否爲multipart/form-data類型
        if (ServletFileUpload.isMultipartContent(request)) {
            try {
                // 1. 創建DiskFileItemFactory對象,設置緩衝區大小和臨時文件目錄
                DiskFileItemFactory factory = new DiskFileItemFactory();
                // System.out.println(System.getProperty("java.io.tmpdir"));//默認臨時文件夾
                // 2. 創建ServletFileUpload對象,並設置上傳文件的大小限制。
                ServletFileUpload sfu = new ServletFileUpload(factory);
                sfu.setSizeMax(10 * 1024 * 1024);// 以byte爲單位 不能超過10M 1024byte =
                // 1kb 1024kb=1M 1024M = 1G
                sfu.setHeaderEncoding("utf-8");
                // 3.調用ServletFileUpload.parseRequest方法解析request對象,得到一個保存了所有上傳內容的List對象。
                @SuppressWarnings("unchecked")
                List<FileItem> fileItemList = sfu.parseRequest(request);
                Iterator<FileItem> fileItems = fileItemList.iterator();
                // 4. 遍歷list,每迭代一個FileItem對象,調用其isFormField方法判斷是否是上傳文件
                while (fileItems.hasNext()) {
                    FileItem fileItem = fileItems.next();
                    // 普通表單元素
                    if (fileItem.isFormField()) {
                        String name = fileItem.getFieldName();// name屬性值
                        String value = fileItem.getString("utf-8");// name對應的value值
                        System.out.println(name + " = " + value);
                    }
                    // <input Type="file">的上傳文件的元素
                    else {
                        String fileName = fileItem.getName();// 上傳的文件名稱
                        System.out.println("原文件名:" + fileName);// Monkey.jpg
                        String suffix = fileName.substring(fileName.lastIndexOf('.'));//獲取文件擴展名
                        System.out.println("擴展名:" + suffix);// .jpg
                        // 新文件名(唯一)
                        String newFileName = new Date().getTime() + suffix;
                        System.out.println("新文件名:" + newFileName);// 1478509873038.jpg
                        // 5. 調用FileItem的write()方法,寫入文件

                        //文件存儲位置
                        ServletContext context = this.getServletContext();
                        // 獲取絕對路徑
                        String serverPath = context.getRealPath("")+headImgFileName;//
                        System.out.println(serverPath);
                        // 如果存放頭像的文件夾不存在則創建
                        File headFile = new File(serverPath);
                        if (!headFile.exists()) {
                            headFile.mkdirs();
                        }
                        //將圖片存入文件夾
                        File headImage = new File(serverPath,newFileName);
                        // 將上傳的文件寫到服務器上指定的文件。
                        fileItem.write(headImage);
                        // 6. 調用FileItem的delete()方法,刪除臨時文件
                        fileItem.delete();
                        
                        //7:接下來就是把圖片路徑(headUrl)存儲到自己的數據庫中去了
                        headUrl = headImgFileName+"/"+newFileName; // 拼接相對路徑 headImage/1478509873038.jpg
                        System.out.println(headUrl);
                        // 自己的把圖片路徑存儲到數據庫中的操作,,,,,,
                        BloggerDao bloggerDao = new BloggerDao();
                        if(bloggerDao.updateHead(blogger.getBlogger_id(),headUrl) > 0) {
                            System.out.println("修改頭像圖片地址成功");
                            //存儲成功後,把路徑存到session裏面,重定向到提交圖片的界面,進行回顯
                            session.setAttribute("headUrl",headUrl);
                            response.sendRedirect(" ../jsp/blogger.jsp");
                        } else {                           
                        	System.out.println("頭像路徑更改失敗");
                        }
                    }
                }
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
        System.out.println("請求格式錯誤");
    }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }

注意:上面代碼最後有一個存儲圖片路徑到數據庫的操作,需要自己編寫,就是簡單地數據庫操作,相信大家肯定都會

4:jsp編寫

blogger.jsp

<form id="headImgForm" method="post"enctype="multipart/form-data">
	//  ../${blogger.header_por}是數據回顯,當數據庫存儲之後,把上傳的圖片路徑存儲在session裏,前端直接獲取session里路徑的值,顯示圖片。這裏是相對路徑,大家需要根據先jsp文件所在的位置與Web項目下存儲圖片的位置編寫自己的相對路徑
    <img src="../${blogger.header_por}" class="head" id="image">
    <input type="file" name="files" id="file">
    <input type="submit" value="上傳頭像"/>
</form>

注意:

  1. 普通表單提交默認enctype=“application/x-www-form-urlencoded”;但是當表單中存在文件類型時,需要設置enctype=“multipart/form-data”,它不對字符進行編碼,用於發送二進制的文件(即所有文件類型,如視頻、圖片、音樂、文檔都可以用此類型entype);還有一種enctype="text/plain"用於發送純文本內容。
  2. 表單請求方式必須爲post。
  3. 接收時不能再用request.getParameter(),而是request.getInputStream()解析二進制流,得到ServletInputStream對象。
大功告成

這樣就可以完成了jsp+servlet+Mysql 在數據庫中的存取操作了

如果大家想了解學習更多有關FileUpload的知識,可以看看這篇博客:
java web文件上傳——FileUpload

參考文章鏈接

https://www.jb51.net/article/107000.html
https://blog.csdn.net/linghuainian/article/details/82253247

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章