spring boot

SpringBoot + zyupload :优雅的实现网站文件

2021-03-12  本文已影响0人  掌灬纹

前言:近期做网站项目遇到一个小功能,实现网站用户自定义上传头像,中间踩了很多坑,所以拿来分享一下,有涉及该类技术问题(SpringBoot项目文件上传)可参考一下

1.开发前准备

        <!--io流-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

package com.ht.webfront.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 *  * 用户实体类
 *  * </p>
 *  *
 *  * @author 掌灬纹
 *  * @since 2021-03-11
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="User对象", description="")
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "自增id")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    @ApiModelProperty(value = "用户编号")
    private String uid;

    @ApiModelProperty(value = "角色编号")
    private Integer roleId;

    @ApiModelProperty(value = "用户名")
    private String username;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "头像")
    private String avatar;

    @ApiModelProperty(value = "登录时间")
    private Date loginDate;

    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private Date gmtCreate;

    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date gmtModified;

    @ApiModelProperty(value = "版本号")
    @Version
    private Integer version;

    @ApiModelProperty(value = "逻辑删除")
    @TableLogic
    private Integer deleted;

}

2. 定义上传路径常量(常量信息提取)

package com.ht.webfront.persistence;

/**
 * 资源路径枚举
 */
public class ResourceConst {
    /**
     * 资源存储根路径
     */
    public static final String ROOT_PATH = "D:\\resources\\";

    // 视频文件
    public static final String VIDEO = "video\\";

    // 图片
    public static final String IMAGE = "image\\";

    // 文档 xls xlsx
    public static final String DOCUMENT = "document\\";

    // avatar 特定头像存放位置
    public static final String AVATAR = "avatar\\";

}

3.编写简易前端页面 (含头像展示,zyupload文件上传插件即可,部分代码示例)

        <!--头像上传-->
        <div class="col-md-9 blog-main">
            <div class="layuimini-container">
                <div class="layuimini-main">
                    <blockquote class="layui-elem-quote">
                        头像上传: <br>
                        仅支持 png jpg 格式单个图片上传,最大1MB(*^_^*)~
                    </blockquote>
                    <div id="zyupload" class="zyupload"></div>
                </div>
            </div>
        </div>

<script type="text/javascript">
    $(function () {
        // 初始化插件
        $("#zyupload").zyUpload({
            width: "650px",                 // 宽度
            height: "400px",                 // 宽度
            itemWidth: "140px",                 // 文件项的宽度
            itemHeight: "120px",                 // 文件项的高度
            url: "/user/avatarUpload",  // 上传文件的路径
            fileType: ["jpg", "png"],// 上传文件的类型
            fileSize: 1048576,                // 上传文件的大小
            multiple: false,                    // 是否可以多个文件上传
            dragDrop: true,                    // 是否可以拖动上传文件
            tailor: true,                    // 是否可以裁剪图片
            del: true,                    // 是否可以删除文件
            finishDel: true,                  // 是否在上传文件完成后删除预览
            /* 外部获得的回调接口 */
            onSelect: function (selectFiles, allFiles) {    // 选择文件的回调方法  selectFile:当前选中的文件  allFiles:还没上传的全部文件
                /*                console.info("当前选择了以下文件:");
                                console.info(selectFiles);*/
            },
            onDelete: function (file, files) {              // 删除一个文件的回调方法 file:当前删除的文件  files:删除之后的文件
                alert("当前删除了图片:" + file.name);
            },
            onSuccess: function (file, response) {          // 文件上传成功的回调方法

                alert("头像上传成功:"+file.name);
                //$("#uploadInf").append("<p>上传成功,文件地址是:" + response + "</p>");
            },
            onFailure: function (file, response) {          // 文件上传失败的回调方法
                alert("头像上传失败:" + file.name);
            },
            onComplete: function (response) {                 // 上传完成的回调方法
                alert("头像上传完成!");
            }

        });
        return false;
    });
</script>

4.根据前端JS定义的上传插件处理 URL路径编写控制器(/user/avatarUpload)

@Controller
public class UserController{
    @ResponseBody
    @PostMapping("/user/avatarUpload")
    public String doUploadAvatar(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam("file") MultipartFile file
    ){
        // 上传根路径
        String rootPath = ResourceConst.ROOT_PATH + ResourceConst.AVATAR;
        //文件名 后缀名
        String filename = file.getOriginalFilename();
        String suffix = filename.substring(filename.lastIndexOf("."));
        // 唯一文件名
        String uidFile = CupidUtils.getUuid() + suffix;

        //System.out.println(rootPath + " : " + uidFile);

        // 图片上传
        File target = new File(rootPath,uidFile);
        if (!target.exists()){
            target.mkdirs();
        }

        try {
            file.transferTo(target);
            // todo: 修改数据库头像位置信息
            User user = (User) request.getSession().getAttribute(LoginUser.LOGIN_USER_SESSION);
            // 获取本地静态资源路径
            String localPath = "/staticmv/avatar/" + uidFile;
            user.setAvatar(localPath);
            userService.updateById(user);
            return "头像上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "头像上传失败!";
    }
}

5. 最关键,配置SpringBoot 静态资源路径映射

package com.ht.webfront.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/staticmv/**").addResourceLocations("file:///D:\\resources\\");
        //addResourceHandlers(registry);
    }
}

#对外暴露 静态资源接口
file:
  uploadFloder: D:/resources/
  staticAccessPath: /static/**
  common:
    uploadWindow: D:\resources\

6.可以测试了┗|`O′|┛ 嗷~~

(1).上传图片


界面.jpg 选择文件.jpg

(2). mybatis-plus 控制台打印日志(更新数据库)


日志 数据库字段修改

(3). 刷新页面,展示成果 ( :


头像上传成功 本地目录

ps:文中相关资源可私信作者获取~

上一篇下一篇

猜你喜欢

热点阅读