JavaWeb上传图片到项目目录并将相对路径保存到数据库 踩坑

首先放出来成功的方法

两个jar包:

commons-fileupload-1.4.jar
commons-io-2.4.jar

前端使用from表单提交图片

HTML

<form action="${pageContext.request.contextPath}/pictureServlet" method="post" enctype="multipart/form-data">
      <input id="input" type="file" name="file">
      <button id="btn" type="submit ">提交</button>
</form>
    <img id="img" src="">

JS实现预览

此时的预览所获得的路径不能传到后台操作,是blob:http…格式,下面会说

$("#a").change(function (e) {
        console.log(e)
        reader.readAsDataURL(this.files[0]);
          reader.onload = function(e){
            console.log(e.target.result);
            document.getElementById("img").src = e.target.result;
          }
      })

Servlet

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

import javax.net.ssl.HttpsURLConnection;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet("/pictureServlet")
public class PictureServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/plain;charset=utf-8");
		
		//此处将新建的文件直接保存到项目的绝对路径中。File没有读写能力。
        File savePath = new File("E:\\javaEE\\Project\\Picture\\web\\images");
        DiskFileItemFactory factory = new DiskFileItemFactory();//jar包的类
        ServletFileUpload upload = new ServletFileUpload(factory);//jar包的类

        try {
            List<FileItem> items = upload.parseRequest(request);
            //将前端的表单数据封装成list。
            //form表单必须加enctype="multipart/form-data",在使用包含文件上传控件的表单时,必须使用该值。
            for (FileItem item:items){
                if(item.isFormField()){
					//说明普通表单项
                }else {
                	//说明上传文件项
                	//获取上传文件的名称
                    String name  = item.getName();
                    //获取相对路径
                    String path = request.getContextPath()+"/images/"+name;
                    //将相对路径保存到数据库
                    Test test = new Test();
                    test.update(path);
					//使用绝对路径完成文件上传
                    item.write(new File(savePath,name));
                    //删除临时文件
                    item.delete();
                }
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

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

坑在哪

  1. 在直接使用input上传而不用from表单时,获取到的路径是 …\fakepath\img.jpg ,由于浏览器的安全机制,input file的路径时被fakepath代替,隐藏了真实物理路径。其中fakepath目前基本没有转换的方法,仅有低版本ie和火狐上有一些方法获得到文件的绝对路径。
  2. 在使用createObjectURL(file)上传图片获取路径时,从其内读取到的url格式为:blob:http…同样为加密。要使用 blob 来表征数据资源,需要服务端返回的为资源的二进制数据,前端拿到后,通过createObjectURL(file)挂载到页面上。我在直接保存到数据库的时候每次都会不一样,所以放弃了这种方法。但是可以像上面那样做预览时用。
  3. 注意获取路径不能把图片直接转换成二进制数据,那样等于是保存的图片本身而不是其路径。引用网友的回答:“图片适合用base64保存么?”。
总结
  1. 前端传图片放在from里,加上enctype=“multipart/form-data”
  2. 存在项目内时用绝对路径,如果想要新建文件夹的话可以使用判断是否存在,如果不存在调用makedir的方法新建文件夹。
  3. 保存图片时名字记得加上new Data(),避免名字重复。

jar包太香了,想深入了解的可以再去学习/回顾下io操作。

顺便码一下:
io详解
java web 上传图片到项目目录并将文件路径放到数据库
JAVA IO流编程 实现文件的写入、写出以及拷贝

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
JavaWeb应用是基于Java语言的网络应用程序,通过Java语言实现Web应用程序的开发。在JavaWeb应用中,我们经常需要实现图片文件上传和预览功能,并将上传的文件存储到数据库中。以下是实现图片文件上传和预览,并将上传的文件存储到数据库中的步骤和注意事项。 1.前端页面的设计和实现 在前端页面中,我们需要设计一个文件上传表单。通过该表单,用户可以选择需要上传的图片文件,然后点击上传按钮上传文件。上传完成后,我们需要在页面中显示预览图。 2.服务端代码的实现 在服务端,我们需要使用Java语言来实现文件上传和预览的功能。具体实现步骤如下: (1)使用Apache commons-fileupload组件来处理文件上传。该组件提供了丰富的API,可以使文件上传变得非常简单。 (2)使用Java ImageIO类读取上传文件,实现预览图片功能。通过该类,我们可以将上传的图片文件解析成内存中的图片,然后将其显示在页面上。 (3)将上传的图片文件路径存储到数据库中。为了便于管理,我们可以将文件存储在具有唯一性的文件夹中,例如以用户ID命名的文件夹。然后将文件路径和用户ID存储到数据库中。 3.注意事项 (1)上传的图片应该进行格式验证,防止上传非图片文件。 (2)上传的图片应该进行大小验证,防止上传过大的图片文件。 (3)上传图片的存储路径需要进行安全验证,防止路径注入攻击。 (4)上传图片的存储路径需要进行唯一性验证,防止文件路径重复。 通过以上步骤和注意事项,就可以实现基于JavaWeb的图片上传和预览功能,并将上传的文件存储到数据库中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白纸一样

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值