牛客网项目7:账号设置

本文详细介绍了如何在用户界面实现头像上传功能,包括用户点击设置后进入页面、文件上传处理、头像存储路径配置以及获取和显示头像的流程。重点展示了Controller、Service和配置文件的交互,适合前端开发者了解SpringMVC操作用户头像的实现。
摘要由CSDN通过智能技术生成

主要是更改头像。

1. 大体思路

①在用户点击【账号设置】按钮,发送【/user/setting】,执行UserController的控制器方法getSettingPage()会返回静态资源【/site/setting】,进入到设置页面;

②我们点击【上传头像】按钮后,发送【/user/upload】,执行UserController的控制器方法uploadHeader()。将文件存储到我们在配置文件中设置的路径下,并更新当前user的headerUrl属性为指定格式的路径;

③当我们需要访问头像(即user的headerUrl属性)时,控制器方法getHeader()会根据headerUrl,将对应目录下的头像复制出来。

2. 用户控制器

在controller目录下新建控制器类:UserController

package com.nowcoder.mycommunity.controller;

import com.nowcoder.mycommunity.entity.User;
import com.nowcoder.mycommunity.service.UserService;
import com.nowcoder.mycommunity.util.CommunityUtil;
import com.nowcoder.mycommunity.util.HostHolder;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

@Controller
@RequestMapping("/user")
public class UserController {
    private  static final Logger logger = LoggerFactory.getLogger(UserController.class);

    //注入文件的上传路径
    @Value("${community.path.upload}")
    private String uploadPath;
    //注入域名
    @Value("${mycommunity.path.domin}")
    private String domain;
    //访问路径
    @Value("${server.servlet.context-path}")
    private String contextPath;

    @Autowired
    private UserService userService;

    @Autowired
    private HostHolder hostHolder;

    //进入账号设置
    @RequestMapping(path="/setting",method = RequestMethod.GET)
    public String getSettingPage(){
        return "/site/setting";
    }
    
    //上传头像
    @RequestMapping(path = "/upload", method = RequestMethod.POST)
    public String uploadHeader(MultipartFile headerImage, Model model){
        //如果没上传头像,就点击上传头像按钮
        if(headerImage == null){
            model.addAttribute("error","您还没有选择图片!");
            return "/site/setting";
        }
        //获取图片后缀名
        String fileName = headerImage.getOriginalFilename();
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        if(StringUtils.isBlank(suffix)){    //如果后缀名为空
            model.addAttribute("error","文件格式不正确!");
            return "/site/setting";
        }
        //生成随机的文件名
        fileName = CommunityUtil.generateUUID() + suffix;
        File dest = new File(uploadPath + "/" + fileName);
        try {
            headerImage.transferTo(dest);
        } catch (IOException e) {
            logger.error("上传文件失败:" + e.getMessage());
            throw new RuntimeException("上传文件失败,服务器发生异常!", e);
        }
        //到此就可以正常进行了
        //更新当前用户头像的路径(Web访问路径)
        //格式:http://localhost:8080/community/user/header/xxx.png
        User user = hostHolder.getUser();
        String headerUrl = domain + contextPath + "/user/header/" + fileName;
        userService.updateHeader(user.getId(), headerUrl);

        return "redirect:/index";
    }

    //获取头像(和上面头像设置时的路径格式保持一致)
    @RequestMapping(path = "/header/{fileName}", method = RequestMethod.GET)
    public void getHeader(@PathVariable("fileName") String fileName, HttpServletResponse response){
        //服务器存放路径
        fileName = uploadPath + "/" + fileName;
        //文件后缀
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        //响应图片(浏览器响应图片时,为此写法)
        response.setContentType("image/" + suffix);
        //获取字节流
        try (
                //此为java7写法,这里面声明的变量会自动加finally,在里面自动关闭
                //而输出流会被SpringMVC自动关闭
                FileInputStream fis = new FileInputStream(fileName);
                OutputStream os = response.getOutputStream();
        ){
            byte[] buffer = new byte[1024];
            int b = 0;
            while((b = fis.read(buffer)) != -1){
                os.write(buffer, 0, b);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

3. 更新用户头像方法

在UserService类中添加方法

    //更新用户头像
    public int updateHeader(int userId, String headurl){
        return userMapper.updateHeader(userId, headurl);
    }

4. 配置文件

添加文件的上传存储路径。

# 上传资源存放的位置
community.path.upload=e:/nowcoder/data/upload

5. html

①首页index.html:进入【账号设置】。

<div class="dropdown-menu" aria-labelledby="navbarDropdown">
    <a class="dropdown-item text-center" href="site/profile.html">个人主页</a>
    <a class="dropdown-item text-center" th:href="@{/user/setting}">账号设置</a>
    <a class="dropdown-item text-center" th:href="@{/logout}">退出登录</a>
    <div class="dropdown-divider"></div>
    <span class="dropdown-item text-center text-secondary" th:utext="${loginUser.username}">nowcoder</span>
</div>

②账号设置页面setting.html:上传头像

                <!-- 上传头像 -->
				<h6 class="text-left text-info border-bottom pb-2">上传头像</h6>
				<form class="mt-5" method="post" enctype="multipart/form-data" th:action="@{/user/upload}">
					<div class="form-group row mt-4">
						<label for="head-image" class="col-sm-2 col-form-label text-right">选择头像:</label>
						<div class="col-sm-10">
							<div class="custom-file">
								<!-- name需要与控制器方法中形参名相同 -->
								<input type="file" th:class="|custom-file-input ${error!=null?'is-invalid':''}|"
									   id="head-image" name="headerImage" lang="es" required="">
								<label class="custom-file-label" for="head-image" data-browse="文件">选择一张图片</label>
								<div class="invalid-feedback" th:text="${error}">
									该账号不存在!
								</div>
							</div>
						</div>
					</div>
					<div class="form-group row mt-4">
						<div class="col-sm-2"></div>
						<div class="col-sm-10 text-center">
							<button type="submit" class="btn btn-info text-white form-control">立即上传</button>
						</div>
					</div>
				</form>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值