springboot图片/文件上传

摘要:
在项目中频繁使用文件上传是不可避免的。我找到了一些材料,并将它们整理成工具,以便将来直接使用。此处使用演示记录。代码如下:使用ajax提交数据的HTML代码:<!DOCTYPEhtml>&书信电报;htmllang=“en”>&书信电报;头部>&书信电报;元字符集=“UTF-8”>&书信电报;标题>标题</标题></头部&

在项目中难免会经常使用到文件上传,去找了一些资料,整理成工具类,方便以后直接使用。在这里使用一个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,如果有什么不对的地方,请多指教(#^.^#)!

免责声明:文章转载自《springboot图片/文件上传》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇duilib入门问题集PostGIS拓扑:TOPOLOGY下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ASP.NET MVC 文件上传和路径处理

ASP.NET MVC 文件上传和路径处理总结目录   文件的上传和路径处理必须解决下面列出的实际问题:   1.重复文件处理   2.单独文件上传   3.编辑器中文件上传   4.处理文章中的图片路径   5.处理上传地址的变化   一.上传文件和重复文件处理   文件处理的原则是:不在数据库中保存文件,只在数据库中保存文件信息(Hash值等)。采取文...

如何提升大容量文件上传性能

背景618压测过程中,涉及大规格的参数化文件上传平台,由于文件过大超过2G,在平台上传过程中经常失败,超时,重试也要等老半天,这就会造成人力资源等待影响工作效率。那么应该怎么做才能快速上传,如何提高文件上传性能以及做到就算失败了再次重试也能从上次中断的地方继续上传提升系统的容错能力呢 ?我学习整理了一些优化思路,在此分享给大家,请君看下文分解~~~  ...

Java操作FTP,从FTP上读取指定文件,把指定文件上传到FTP

需要添加的依赖 <!-- https://mvnrepository.com/artifact/commons-net/commons-net --> <dependency> <groupId>commons-net</groupId>...

模拟文件上传(一):手动文件上传

关于上传文件,首先我的第一个案例是一个文本文件的上传,简单容易上手! 首先我们上传文件肯定就属于实体内容部分了;所以不能过GET方式请求了,要通过POST方式请求; 因为: 1.get方式是URL传值,URL长度是有限的,很短,并且实体内容只能通过POST传递;因为只有POST方式才有content-type属性。 2.因为是实体内容,所以不能通过getP...

实现带有进度条的多文件上传

应用RESPONSE.WRITE实现带有进度条的多文件上传   前几天,写过一篇随笔“使用RESPONSE.WRITE实现在页面的生命周期中前后台的交互”。说是交互,实际上也主要是在ASP.NET的页面周期中 从后台利用RESPONSE.WRITE向前台即时的推送内容。   该篇随笔算是对上一篇文章的实际应用,利用RESPONSE.WRITE的这个特性实...

Jfinal文件上传

前端样式,代码 前端函数 在前端对所要上传的文件进行类型和大小的校验,然后走initUploadForm();方法进行后台上传 html注意事项 form表单要加<form name="myform" method="post"enctype="multipart/form-data"> 后台controller,并在数据库记录上传...