尘谌 2024-06-23 01:42 采纳率: 57.1%
浏览 6

基于SSM框架的JavaWeb项目,上传文件功能

这是我想要实现的功能,请大家帮忙看看代码这样写能实现吗?我运行时网页控制台报错:
POST http://localhost:8080/uploadAvatar 400 (Bad Request)
基于SSM框架实现项目启动时进入登录界面,输入用户名、密码后进入用户信息展示页面,有用户昵称,邮箱,头像,点击头像可以上传图片修改头像,图片保存到Web项目下的img文件夹,图片的地址保存到数据库并在前台显示上传的图片。用户表中有多个用户,上传的图片要保存到相对应的用户栏中,且上传新的图片地址数据时会删除旧的图片地址数据。
UserMapper.xml:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.shm.mapper.UserMapper">

    <insert id="addUser" parameterType="com.shm.domain.User">
        INSERT INTO user (user_name,user_password,user_email,user_role,user_status,photo)
        VALUES (#{name},#{password},#{email},#{role},'0','img/user.jpg')
    </insert>

    <update id="updateUser" parameterType="com.shm.domain.User">
        UPDATE user SET photo = #{photo} WHERE user_email = #{email}
    </update>

</mapper>

UserServiceImpl.java:

@Service
public class UserServiceImpl implements UserService {
    //注入userMapper
    @Autowired
    private UserMapper userMapper;
    //通过User的用户账号和用户密码查询用户信息
    @Override
    public User login(User user) {
        return userMapper.login(user);
    }
    public void addUser(User user) {
        userMapper.addUser(user);
    }
    public void updateUser(String email, String photo){userMapper.updateUser(email,photo);}

}

UserController.java:

@Controller
public class UserController {
    @RequestMapping("/toMainPage")
    public String toMainPage() {
        return "main";
    }

    //注入userService
    @Autowired
    private UserService userService;

    //注册用户
    @RequestMapping(value = "/register")
    public String register(User user,HttpServletRequest request,Model model) {
        System.out.println(user);
        userService.addUser(user);
        request.setAttribute("msg", "注册成功");
        return "login3";
    }


    /*
   用户登录
    */
    @RequestMapping("/login")
    public String login(User user, HttpServletRequest request, HttpSession session) {
        try {
            User u = userService.login(user);
            /*
            用户账号和密码是否查询出用户信息
                是:将用户信息存入Session,并跳转到后台首页
                否:Request域中添加提示信息,并转发到登录页面
             */
            if (u != null) {
//                request.getSession().setAttribute("USER_SESSION",u);
                session.setAttribute("USER_SESSION", u);
                return "redirect:/admin/main.jsp";
            }
            request.setAttribute("msg", "用户名或密码错误");
            return "forward:/admin/login3.jsp";
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msg", "系统错误");
            return "forward:/admin/login3.jsp";
        }
    }

    /*
    注销登录
     */
    @RequestMapping("/logout")
    public String logout(HttpServletRequest request) {
        try {
            HttpSession session = request.getSession();
            //销毁Session
            session.invalidate();
            return "forward:/admin/login3.jsp";
        } catch (Exception e) {
            e.printStackTrace();
            request.setAttribute("msg", "系统错误");
            return "forward:/admin/login3.jsp";
        }
    }

//    跳转个人信息页面
    @RequestMapping("/toInfo")
    public ModelAndView toInfo(HttpServletRequest request, HttpSession session){
        //获取当前登录的用户
        User user = (User) request.getSession().getAttribute("USER_SESSION");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("xxuser");
        return modelAndView;
    }

    //用户修改头像
    @RequestMapping("/uploadAvatar")
    @ResponseBody
    public String uploadAvatar(@RequestParam("file") MultipartFile file, HttpServletRequest request,HttpSession session) {
        // 获取当前用户邮箱
        String userId = getCurrentUserId(request, session);

        // 保存图片到服务器
        String fileName = file.getOriginalFilename();
        String filePath = "img/" + fileName;
        try {
            file.transferTo(new File(filePath));
        } catch (IOException e) {
            return "上传失败";
        }

        // 更新数据库中的头像地址
        userService.updateUser(userId, filePath);
        return "上传成功";
    }

    // 获取当前登录用户ID的方法
    private String getCurrentUserId(HttpServletRequest request,HttpSession session) {
        //获取当前登录的用户邮箱
        String email = ((User) session.getAttribute("USER_SESSION")).getEmail();
        return email;
    }

}

前端页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>个人信息</title>
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    <style>
        /* CSS样式 */
    </style>
</head>
<body>
<div id="userInfo">
    <h2>${USER_SESSION.name}</h2>
    <p>Email: ${USER_SESSION.email}</p>
    <img id="avatar" src=${pageContext.request.contextPath}/${USER_SESSION.photo} alt="Avatar">
    <input type="file" id="fileInput" accept="image/*">
    <button onclick="uploadAvatar()">Upload Avatar</button>
</div>
<script src="${pageContext.request.contextPath}/js/xx.js"></script>
</body>
</html>

js部分:

function uploadAvatar() {
    var fileInput = document.getElementById('fileInput');
    var file = fileInput.files;

    if (!file) {
        alert('Please choose a file.');
        return;
    }

    var formData = new FormData();
    formData.append('file', file);

    $.ajax({
        url: 'http://localhost:8080/uploadAvatar',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function(response) {
            if (response === '上传成功') {
                alert("头像更换成功")
            } else {
                alert("头像更换失败");
            }
        },
        error: function() {
            alert('An error occurred during upload.');
        }
    });
}
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-23 01:42
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据你提供的代码和描述,400 (Bad Request) 错误通常是因为客户端请求的格式不正确或请求参数不符合服务器端的要求。以下是一些可能的问题和解决方案:

    1. 检查前端表单提交

      • 确保你的前端表单是正确配置的,特别是enctype属性应该设置为multipart/form-data,这是必须的,因为你要上传文件。
    2. 检查请求头

      • 确保你的 AJAX 请求头正确设置了Content-Typemultipart/form-data。在你的 AJAX 调用中,你已经设置了contentType: false,这是正确的,因为它告诉jQuery不要设置Content-Type头,因为FormData对象会自动设置正确的Content-Type
    3. 检查后端接收参数

      • 你的后端uploadAvatar方法中,使用了@RequestParam("file") MultipartFile file来接收上传的文件。确保前端的表单或 AJAX 请求中文件的字段名称与@RequestParam中的名称匹配。
    4. 检查文件保存逻辑

      • 你的代码中尝试将上传的文件保存到服务器的img/目录下。确保这个目录存在,并且应用服务器有权限写入这个目录。
    5. 检查数据库更新逻辑

      • 在更新数据库之前,确保你已经正确地从请求中获取了当前用户的邮箱(userId),并且在更新数据库之前,考虑是否需要删除旧的图片文件。
    6. 检查异常处理

      • 如果在文件上传过程中发生异常,确保你已经正确地捕获并处理了这些异常。在你的uploadAvatar方法中,如果发生IOException,你返回了"上传失败",这是一个好的做法。
    7. 检查跨域问题(如果你的前端和后端不在同一个域):

      • 如果你的前端和后端不在同一个域,你可能需要配置CORS(跨源资源共享)。
    8. 检查Spring MVC配置

      • 确保你的Spring MVC配置允许大文件上传。你可能需要在Spring的配置文件中设置multipartResolvermaxUploadSize
    9. 检查日志

      • 查看服务器日志,可能会有更详细的错误信息,这有助于诊断问题。
    10. 测试其他文件

      • 尝试上传不同类型的文件,以确保问题不是由特定文件类型引起的。

    如果上述检查都没有问题,但问题仍然存在,你可以尝试以下步骤:

    • 使用浏览器的开发者工具查看网络请求的详细信息,特别是请求头和响应头。
    • 确保你的服务器端没有其他安全设置阻止文件上传。
    • 检查是否有其他Spring MVC的配置可能影响文件上传。

    如果你需要更具体的帮助,可以提供更多的错误信息或日志,这样我可以提供更针对性的建议。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月23日

悬赏问题

  • ¥15 mysql将查询的结果作为动态列名怎么实现
  • ¥50 python自动地图截图脚本
  • ¥15 悬赏一本书(内含Matlab代码)的书名、作者
  • ¥20 瑞萨RA4M1芯片刷写为arduino r4 minima
  • ¥15 前端vue跟后端java服务部署在线上阿里云服务器
  • ¥15 fastreport怎么判断当前页数
  • ¥15 Kylin-Desktop-V10-GFB-Release-JICAI_02- 2207-Build14-ARM64.iso有没有这个版本的系统啊
  • ¥15 能不能通过蓝牙将传感器数据传送到手机上
  • ¥20 100元python和数据科学实验项目
  • ¥15 根据时间在调用出列表