idea图片上传保存实现方式

 更新时间:2026年01月05日 09:18:58   作者:努力学习的明  
文章介绍了一个改良版的register.jsp页面项目结构方案,在改良版本中,通过req.getServletContext().getRealPath("/upload")方法获取路径时,可能会遇到获取到war包下面的路径问题,解决方法是在WEB-INF下创建一个classes文件,修改部署点,选择自己的web路径,并删除out文件

编写一个register.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>文件上传</title>
</head>
<body>
<%-- 这里表单提交方式为post,并且enctype设置为"multipart/form-data"文件以二进制的数据传输 --%>
<form action="/fileUpload" method="post" enctype="multipart/form-data">
    <p>用户名:<input type="text" name="username" /></p>
    <p>头像:<input type="file" name="headImg" /></p>
    <input type="submit" value="注册">
</form>
<%-- 这里只是为了显示我们上传的图片/upload目录下面的favicon.jpg图片 --%>
<img src="/upload/favicon.jpg" width="100px" >
</body>
</html>

项目结构

方案一:简单的上传:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.util.Scanner;
//这里注意两个类(FileUploadServlet 和 FileUploadServlet 2)的 运行路径都是/fileUpload所以不能两个同时打开会有冲突
//@WebServlet("/fileUpload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("fileUpload");
        // 在文件上下传中,无法通过常规方法获取数据
        String username = req.getParameter("username");
        String headImg = req.getParameter("headImg");
/*      null:username
        null:headImg  获取的结果都为null  需要加入特别的注解
        @MultipartConfig
        xim:username
        null:headImg 但是文件头像还是无法获取,因为文件的传输是二进程传输
        System.out.println(username+":username");
        System.out.println(headImg+":headImg");*/

        //   方法一: 用流的方式读取  但是这个方法读取的都是乱码,而且不能使用@MultipartConfig
/*        Scanner sc = new Scanner(req.getInputStream());
        while (sc.hasNextLine()){
            System.out.println(sc.nextLine());
        }*/

        //方法二:通过API获取  开启@MultipartConfig注解
        //普通控件数据还是使用 getParameter 方法来获取
        System.out.println("username:" + req.getParameter("username"));
        //文件控件数据获取 使用 Part类中的API获取
        Part part = req.getPart("headImg");
        // 把得到的数据卸载磁盘上
        part.write("E:/headImg.jpg");
        //缺点路径协 写死 ,不灵活,改进
    }
}

改良版

package servlet;


import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

@WebServlet("/fileUpload")
@MultipartConfig
public class FileUploadServlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("fileUpload2");
       req.setCharacterEncoding("utf-8");
       resp.setCharacterEncoding("utf-8");

        // 文件控件数据获取
        Part part = req.getPart("headImg");
        //通过getSubmittedFileName() 方法 得到提交的数据名称 来获取文件名
        //  但是得到得到名字是乱码  所以要记得 设置req 和 resp 的编码格式
        System.out.println(part.getSubmittedFileName());
        String filename = part.getSubmittedFileName();
        // 保存到磁盘上
//        part.write("E:/" + filename);

        //这里虽然,写活了 但是会存在名字相同所以会覆盖原内容的情况
        //因此 文件的名字因该为不会重名,使用UUID 设置文件名
        //首先 :先获取文件的后缀名
        String ext = filename.substring(filename.lastIndexOf("."));
        String uuidName =  UUID.randomUUID().toString() + ext;
        System.out.println(uuidName); //513904c8-24cc-4842-a4b5-ac3875072194.jpg
//        part.write("E:/"+uuidName);
        //缺点  还是路径写死不灵活,别人不一定要保存到E盘
        /*
            所以我们要保存到我们服务器中
                    直接放到web下,用来专门存放下载图片
         */
        //将图片保存到我们的upload 文件中
//        part.write("E:\\idea\\IdeaProjects\\SpringCloudProject-HEAD\\javaweb_010_02\\web\\upload\\"+uuidName);
       // 缺点,路径写死不灵活,使用方法来获取 upload的路径位置
        System.out.println(req.getServletContext().getRealPath("/upload"));
/*
        但是现在获取的路径是out 下面的upload的路径 改变项目的部署位置
        E:\\idea\\IdeaProjects\\SpringCloudProject-HEAD\\javaweb_010_02\\out\\artifacts\\javaweb_010_02_war_exploded\\upload

        改完之后 项目路径为
        E:\\idea\\IdeaProjects\\SpringCloudProject-HEAD\\javaweb_010_02\\web\\upload
 */
        String realPath = req.getServletContext().getRealPath("/upload");
        //在重新写进去
        System.out.println(realPath + "\\" + uuidName);
        part.write(realPath+"\\"+uuidName);
        //自此 图片的上传结束
    }
}

在改良版本会遇到一个问题那就是通过 

req.getServletContext().getRealPath("/upload"); 方法获取路径的时候会遇到获取到 war包下面的路径问题也就是 out 下面 upload的路径而不是我们项目中的自己的upload路径

首先 先在 WEB-INF 下创建一个classes文件

然后需要改以下部署 点开旁面的文件夹

找到我们自己创建的classes路径

在修改tomcat的部署环境

选择我们自己web路径

再把我们的out文件删除即可

如果我们自己创建classes不会发黄 ,可以自己手动让他变黄

右键目录

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringSecurity入门使用教程

    SpringSecurity入门使用教程

    ​ Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准,这篇文章主要介绍了如何使用SpringSecurity,需要的朋友可以参考下
    2023-12-12
  • spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    本篇文章主要介绍了spring整合redis缓存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • Spring Data Elasticsearch使用方式(Elasticsearch)

    Spring Data Elasticsearch使用方式(Elasticsearch)

    这篇文章主要介绍了Spring Data Elasticsearch使用方式(Elasticsearch),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java基于IDEA实现qq邮件发送小程序

    Java基于IDEA实现qq邮件发送小程序

    这篇文章主要介绍了Java基于IDEA实现qq邮件发送小程序功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Mybatisplus多表关联分页查询多种实现方式

    Mybatisplus多表关联分页查询多种实现方式

    本文主要介绍了Mybatisplus多表关联分页查询多种实现方式,包括使用XML自定义SQL、Wrapper搭配自定义SQL、使用DTO与自定义SQL及结合PageHelper实现分页查询,感兴趣的可以了解一下
    2025-03-03
  • 利用线程实现动态显示系统时间

    利用线程实现动态显示系统时间

    编写Applet小程序,通过在HTML文档中接收参数,显示当前的系统时间,需要的朋友可以参考下
    2015-10-10
  • springboot 使用mybatis查询的示例代码

    springboot 使用mybatis查询的示例代码

    这篇文章主要介绍了springboot 使用mybatis查询功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • IDEA实现java远程调试全过程

    IDEA实现java远程调试全过程

    文章主要介绍了如何在IntelliJ IDEA中配置远程调试参数,包括transport、server、suspend、address等选项的含义和作用,以及如何配置服务器防火墙以支持远程调试
    2025-11-11
  • Seata AT模式TransactionHook被删除探究

    Seata AT模式TransactionHook被删除探究

    这篇文章主要为大家介绍了Seata AT模式TransactionHook被删除探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 详解Java中多进程编程的实现

    详解Java中多进程编程的实现

    这篇文章主要介绍了详解Java中多进程编程的实现,和多线程一样,多进程同样是实现并发的一种方式,需要的朋友可以参考下
    2015-11-11

最新评论