• springboot图片/文件上传


    在项目中难免会经常使用到文件上传,去找了一些资料,整理成工具类,方便以后直接使用。在这里使用一个demo记录,代码如下:

    使用ajax提交数据的HTML代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1 >图片上传Demo</h1>
    <form action="/fileUpload" method="post" enctype="multipart/form-data">
        <p>选择文件: <input id="sel_file" type="file" name="photo"/></p>
        <p><input class="submit" type="submit" value="提交"/></p>
    </form>
    
    <script src="../static/js/jquery-3.3.1.min.js"></script>
    <script>
        $(".submit").on("click",function () {
    
            var formData = new FormData();
    
            formData.append("photo",$("#sel_file")[0].files[0]);
    
            $.ajax({
                url:'/fileUpload',
                dataType:'json',
                type:'POST',
                async: false,
                data: formData,
                processData : false, // 使数据不做处理
                contentType : false, // 不要设置Content-Type请求头
                success: function(data){
                    console.log(data);
                    alert(data.msg);
    
                },
                error:function(response){
                    alert('上传异常!');
                }
            });
        });
    </script>
    
    </body>
    </html>

    值得注意的地方是:

    • formData.append里面的key要和文件的input标签的name属性值一致
    • ajax的两个重要属性要设置为false,否则上传会异常:
        • processData : false,// 使数据不做处理
        • contentType : false,

    下面是后端代码

    使用springboot文件上传,需要给出相应的配置

    # 设置单个文件最大内存
    spring.servlet.multipart.max-file-size=10MB
    # 单次请求的文件最大内存
    spring.servlet.multipart.max-request-size=50MB
    
    # 自定义文件上传路径
    web.upload-path=D:/upload/

     上传请求处理的controller

    @Controller
    public class FileUploadController {
    
        //路径
        @Value("${web.upload-path}")
        private String path;
    
    
        @PostMapping("/fileUpload")
        @ResponseBody
        public Map<String, String> upload(@RequestParam(value = "photo")MultipartFile file) throws IOException {
            Map<String, String> map = new HashMap<>();
    
            if (!file.isEmpty()) {
                //存储文件的路径 + 文件分隔符 ('/')+ 文件名
                File filePath = new File(path + File.separator + file.getOriginalFilename());
                //路径不存在就创建一个
                if (!filePath.getParentFile().exists()) {
                    filePath.getParentFile().mkdirs();
                }
                //保存文件
                file.transferTo(filePath);
                map.put("msg", "success");
            }else {
                map.put("msg", "文件不存在");
            }
    
            return map;
        }
    
    }

     一个上传后的文件不会使用原文件名,而是随机生成的不重复的文件名,可以使用UUID生成

    使用UUID随机生成新的文件名

    public class UUIDUtils {
    
        public static String getUUID(){
            return UUID.randomUUID().toString().replace("-", "");
        }
    }

     

    以上就是图片上传的主要代码,能够完成所有文件上传。

    但是,如果前端想访问上传的文件,例如前端要获取上传的文件用于预览,就涉及到跨域问题。需要配置静态资源映射,主要是一个自定义的配置类,代码如下:

    @Configuration
    public class MyWebConfig implements WebMvcConfigurer {
    
        /*
         * 静态资源本地映射
         * img是虚拟路径
         * 映射到本地D盘upload下
         * 浏览器访问:localhost:8080/img/xxx文件
         * */
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
            registry.addResourceHandler("/img/**")      //访问的虚拟路径
                    .addResourceLocations("file:D:/upload/")        //允许跨域的站点路径
                    .setCachePeriod(32456789);  //在指定毫秒内不用请求
    
    
        }
    
    }

    这是我自己写的小demo,如果有什么不对的地方,请多指教(#^.^#)!

  • 相关阅读:
    swagger的使用说明
    Springboot组件:全局异常处理
    打金?工作室?账号被封?游戏灰黑产离我们有多近
    如何用Pygame制作简单的贪吃蛇游戏
    函数式编程
    py接口自动化基础
    py类,实例
    高级特性
    css中margin负值的运用
    css多行文本溢出显示省略号
  • 原文地址:https://www.cnblogs.com/luler/p/13130408.html
Copyright © 2020-2023  润新知