基于jsp+ServletFileUpload+mysql,上传图片存储虚拟地址到数据库并显示

1.数据库表结构:
这里写图片描述
图片在数据库存储方式为虚拟路径 !

2.依赖包:commons-fileupload-1.3.2.jar和commons-io-2.5.jar
下载地址:(根据自己项目jdk版本来下)
http://commons.apache.org/proper/commons-fileupload/
http://commons.apache.org/proper/commons-io/

3.上传页面 upload.jsp

<body>
    <h1>文件上传实例</h1>
    <!-- 表单enctype属性指定数据返回服务器时的编码类型, multipart/form-data表示不对字符编码,上传文件时使用-->
    <form method="post" action="ImageSaveServlet" enctype="multipart/form-data">
    选择一个文件: <input type="file" name="uploadFile" />
    <br/><br/>
    <input type="submit" value="上传" />
    </form>
  </body>

4.servlet处理页面,ImageSaveServlet.java

package servlet;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import util.GeneralDao;

public class ImageSaveServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        // 检测是否为多媒体上传
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是则停止
            PrintWriter writer = response.getWriter();
            writer.println("Error: 表单必须包含 enctype=multipart/form-data");
            writer.flush();
            return;
        }

        // 获取路径来存储文件
        String path = this.getServletContext().getRealPath("/") + "Webroot/image";
        System.out.println("图片存储路径:" + path);

        // 根据路径名创建一个 File实例
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();       // 如果不存在则创建此路径的目录
        }

        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 中文处理
        upload.setHeaderEncoding("utf-8");

        try {
            // 解析请求的内容提取文件数据
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 迭代表单数据
                for (FileItem item : formItems) {
                    // 处理不在表单中的字段
                    if (!item.isFormField()) {
                        System.out.println("提交的是文件 !");
                        String fileName = item.getName();
                        System.out.println("上传的文件名:" + fileName);

                        // 获取文件名后缀, 返回 "."在文件名最后出现的索引, 就是文件后缀名
                        String prefix = fileName.substring(fileName.lastIndexOf(".") + 1);
                        // 存储的文件名根据获取的id来唯一确定, 这里测试使用 "test"
                        // id可以绑定到session或request变量等等,自己根据需要来扩展
                        String id = "test";
                        String fileSaveName = id + "." + prefix; // id.后缀

                        // 获取文件输入流
                        InputStream inputStream = item.getInputStream();
                        // 创建文件输出流,用于向指定文件名的文件写入数据
                        FileOutputStream fileOutputStream = new FileOutputStream(path + "/" + fileSaveName);
                        int index = 0;

                        // 从输入流读取数据的下一个字节,到末尾时返回 -1
                        while ((index = inputStream.read()) != -1) {
                            fileOutputStream.write(index);  // 将指定字节写入此文件输出流
                        }

                        // 关闭流
                        inputStream.close();
                        fileOutputStream.close();
                        item.delete();

                        // 存入数据库
                        String sql = "insert into img_src(name,src) values('test', ?)";
                        // 设置图片存储的虚拟路径
                        String virtualPath = "image/" + fileSaveName;
                        Object values[] = new Object[] {virtualPath};
                        // GeneralDao.update() 为自己写的函数,采用预编译,可以根据自己的来
                        int ok = GeneralDao.update(sql, values);
                        if (ok == 1) {
                            System.out.println("存入数据库成功,虚拟路径为:" + virtualPath);
                        } else {
                            System.out.println("存入数据库失败 !");
                        } // if (ok == 1)  
                    } // if (!item.isFormField())
                } // for
            } // try
        } catch (Exception e) {
            request.setAttribute("message", "错误信息: " + e.getMessage());
        }

        // 重定向到显示图片页面
        response.sendRedirect("show_img_src.jsp");
    }

}

5.显示页面,show_img_src.jsp

<body>

    <%
    String sql = "select id,name,src from img_src";
    List<ImageBean> list = ImageDao.querySrc(sql);
    // 如果结果集不为空
    if (list.size() > 0) {
   %>
    <table>
        <th>id</th><th>名称</th><th>图片</th>
    <%
        for (ImageBean bean : list) {
    %>
        <tr>
        <td><%=bean.getId() %></td>
        <td><%=bean.getName() %></td>
        <!-- 这里 src 路径,要根据目录结构来确定,如果图片显示个X,大多是路径问题 -->
        <td><img style="width:50px;height:50px" src="<%=bean.getSrc()%>"></td>
        </tr>
    <%      
        } // for 
    }// if    
     %>
  </body>

这里的ImageDao.querySrc()函数是我自己写的数据库查询操作函数,也可以用自己函数。

6.到这里为止,就可以部署项目,然后启动服务器查看了
具体文件可以查看源代码:
https://gitee.com/sys_code/ImageShow
求给星

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值