spring文件上传大小限制(spring上传到文件服务器)

零、本篇要点

  • 介绍SpringBoot对文件上传的自动配置。
  • 介绍MultipartFile接口。
  • 介绍SpringBoot+Thymeleaf文件上传demo的整合。
  • 介绍对文件类型,文件名长度等判断方法。

一、SpringBoot对文件处理相关自动配置

自动配置是SpringBoot为我们提供的便利之一,开发者可以在不作任何配置的情况下,使用SpringBoot提供的默认设置,如处理文件需要的MultipartResolver。

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {

	private final MultipartProperties multipartProperties;

	public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
		this.multipartProperties = multipartProperties;
	}

	@Bean
	@ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })
	public MultipartConfigElement multipartConfigElement() {
		return this.multipartProperties.createMultipartConfig();
	}

	@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
	@ConditionalOnMissingBean(MultipartResolver.class)
	public StandardServletMultipartResolver multipartResolver() {
		StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
		multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
		return multipartResolver;
	}

}
  • Spring3.1之后支持StandardServletMultipartResolver,且默认使用StandardServletMultipartResolver,它的优点在于:使用Servlet所提供的功能支持,不需要依赖任何其他的项目。
  • 想要自动配置生效,需要配置spring.servlet.multipart.enabled=true,当然这个配置默认就是true。
  • 相关的配置设置在MultipartProperties中,其中字段就是对应的属性设置,经典字段有:enabled:是否开启文件上传自动配置,默认开启。location:上传文件的临时目录。maxFileSize:最大文件大小,以字节为单位,默认为1M。maxRequestSize:整个请求的最大容量,默认为10M。fileSizeThreshold:文件大小达到该阈值,将写入临时目录,默认为0,即所有文件都会直接写入磁盘临时文件中。resolveLazily:是否惰性处理请求,默认为false。
  • 我们也可以自定义处理的细节,需要实现MultipartResolver接口。

二、处理上传文件MultipartFile接口

SpringBoot为我们提供了MultipartFile强大接口,让我们能够获取上传文件的详细信息,如原始文件名,内容类型等等,接口内容如下:

public interface MultipartFile extends InputStreamSource {
    String getName(); //获取参数名
    @Nullable
    String getOriginalFilename();//原始的文件名
    @Nullable
    String getContentType();//内容类型
    boolean isEmpty();
    long getSize(); //大小
    byte[] getBytes() throws IOException;// 获取字节数组
    InputStream getInputStream() throws IOException;//以流方式进行读取
    default Resource getResource() {
        return new MultipartFileResource(this);
    }
    // 将上传的文件写入文件系统
    void transferTo(File var1) throws IOException, IllegalStateException;
	// 写入指定path
    default void transferTo(Path dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
    }
}

三、SpringBoot+Thymeleaf整合demo
1、编写控制器

/**
 * 文件上传
 *
 * @author Summerday
 */
@Controller
public class FileUploadController {

    private static final String UPLOADED_FOLDER = System.getProperty("user.dir");

    @GetMapping("/")
    public String index() {
        return "file";
    }

    @PostMapping("/upload")
    public String singleFileUpload(@RequestParam("file") MultipartFile file,
                                   RedirectAttributes redirectAttributes) throws IOException {

        if (file.isEmpty()) {
            redirectAttributes.addFlashAttribute("msg", "文件为空,请选择你的文件上传");
            return "redirect:uploadStatus";

        }
        saveFile(file);
        redirectAttributes.addFlashAttribute("msg", "上传文件" + file.getOriginalFilename() + "成功");
        redirectAttributes.addFlashAttribute("url", "/upload/" + file.getOriginalFilename());
        return "redirect:uploadStatus";
    }

    private void saveFile(MultipartFile file) throws IOException {
        Path path = Paths.get(UPLOADED_FOLDER + "/" + file.getOriginalFilename());
        file.transferTo(path);
    }

    @GetMapping("/uploadStatus")
    public String uploadStatus() {
        return "uploadStatus";
    }
}

2、编写页面file.html

本文转载自:https://www.gylmap.com


    

    
        
文件上传界面

            
                

3、编写页面uploadStatus.html





    
        
文件上传界面

            

spring文件上传大小限制(spring上传到文件服务器)

4、编写配置

server.port=8081
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

5、配置虚拟路径映射

这一步是非常重要的,我们将文件上传到服务器上时,我们需要将我们的请求路径和服务器上的路径进行对应,不然很有可能文件上传成功,但访问失败:

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    private static final String UPLOADED_FOLDER = System.getProperty("user.dir");

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/upload/**")
                .addResourceLocations("file:///" + UPLOADED_FOLDER + "/");
    }
}

对应关系需要自己去定义,如果访问失败,可以试着打印以下路径,看看是否缺失了路径分隔符。

注意:如果addResourceHandler不要写成处理/**,这样会拦截掉其他的请求

6、测试页面

执行mvn spring-boot:run,启动程序,访问http://localhost:8081/,选择文件,点击上传按钮,我们的项目目录下出现了mongo.jpg,并且页面也成功显示:

spring文件上传大小限制(spring上传到文件服务器)四、SpringBoot的Restful风格,返回url

/**
 * 文件上传
 *
 * @author Summerday
 */
@RestController
public class FileUploadRestController {

    /**
     * 文件名长度
     */
    private static final int DEFAULT_FILE_NAME_LENGTH = 100;

    /**
     * 允许的文件类型
     */
    private static final String[] ALLOWED_EXTENSIONS = {
            "jpg", "img", "png", "gif"
    };

    /**
     * 项目路径
     */
    private static final String UPLOADED_FOLDER = System.getProperty("user.dir");

    @PostMapping("/restUpload")
    public Map singleFileUpload(@RequestParam("file") MultipartFile file) throws Exception {

        if (file.isEmpty()) {
            throw new Exception("文件为空!");
        }
        String filename = upload(file);
        String url = "/upload/" + filename;
        Map map = new HashMap(2);
        map.put("msg","上传成功");
        map.put("url",url);
        return map;
    }


    /**
     * 上传方法
     */
    private String upload(MultipartFile file) throws Exception {
        int len = file.getOriginalFilename().length();
        if (len > DEFAULT_FILE_NAME_LENGTH) {
            throw new Exception("文件名超出限制!");
        }
        String extension = getExtension(file);
        if(!isValidExtension(extension)){
            throw new Exception("文件格式不正确");
        }
        // 自定义文件名
        String filename = getPathName(file);
        // 获取file对象
        File desc = getFile(filename);
        // 写入file
        file.transferTo(desc);
        return filename;
    }

    /**
     * 获取file对象
     */
    private File getFile(String filename) throws IOException {
        File file = new File(UPLOADED_FOLDER + "/" + filename);
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        if(!file.exists()){
            file.createNewFile();
        }
        return file;
    }

    /**
     * 验证文件类型是否正确
     */
    private boolean isValidExtension(String extension) {
        for (String allowedExtension : ALLOWED_EXTENSIONS) {
            if(extension.equalsIgnoreCase(allowedExtension)){
                return true;
            }
        }
        return false;
    }

    /**
     * 此处自定义文件名,uuid + extension
     */
    private String getPathName(MultipartFile file) {
        String extension = getExtension(file);
        return UUID.randomUUID().toString() + "." + extension;
    }

    /**
     * 获取扩展名
     */
    private String getExtension(MultipartFile file) {
        String originalFilename = file.getOriginalFilename();
        return originalFilename.substring(originalFilename.lastIndexOf('.') + 1);
    }
}



秒鲨号所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈!本站将在三个工作日内改正。
(0)

大家都在看

  • 怎么发外链,新手发外链的15个方法

    废话不多说,今天给大家讲:15个发外链的方法,肯定有一个适合你! 辅助网站的SEO优化的外链平台、外链方法综合: 常用的平台有:飞骑网、精度、红网、客至上、36推、华夏网、39栋同…

    2022年5月3日 专栏投稿
  • 读书怎么读(读书的两种意思)

    上篇文章我写到了关于关于读书的一些感受,现在我想详细将一些关于读书的东西。当我们拿起一本书的时候,一定要想想我们为什么读书?一定要知道自己读书的目的。 周恩来先生可以“为中华之崛起…

    2022年4月22日
  • 借呗额度多少(大学生借呗额度一般多少)

    自2004年12月支付宝公司创立至今,目前支付宝已经成为了全球最大的移动支付厂商之一,已与国内外多达180余家银行以及VISA、MasterCard等国际组织建立了战略合作伙伴关系…

    2022年5月29日 专栏投稿
  • 高清电影播放器(免费看电影的播放器)

    如果您正在查找蓝光播放器什么牌子好?那么本蓝光播放器四大品牌榜单可供您作为选购参考。 1、海美迪 2、OPPO   3、芝杜   4、开博尔 一、海美迪   品牌介绍:海美迪科技成…

    2022年6月27日 专栏投稿
  • 好用的ip代理软件免费(国内好用的ip代理)

      很多从事互联网工作同学在工作和学习中不可避免的直接或间接的接触到代理IP,比如说学习爬虫技术或者从事网络营销,数据采集的同学。但是目前市场的代理IP可谓是鱼日新月异,各种代理i…

    2022年6月20日
  • 切ip软件哪个好(切换ip最好的软件)

    NetSetMan 是一款老牌的 Windows 工具,它可以快速切换电脑网卡的 IP 地址、网关、DNS、打印机、Wi-Fi、工作组、网络驱动器等信息,支持根据条件自动切换配置,…

    2022年6月9日
  • 黄桃多少钱(多少钱一斤草莓)

    2017黄桃多少钱一斤?黄桃是一种很常见的水果,也是一种非常营养的水果,黄桃也是属于桃子的一种,但是价格却比桃子贵一些,那么黄桃为什么比普通桃子贵呢? 黄桃在每年的八月和九月上市,…

    2022年5月30日
  • 金士顿内存条怎么样(揭晓2020金士顿内存市场份额)

    一提起内存条多数消费者一定会想到金士顿,就算是没有买过的人选择金士顿内存条的概率也比选择别的品牌高很多,这样的结果并不意外因为每个消费者在选择没有接触过的物品时肯定会选择口碑好销量…

    2022年6月22日 专栏投稿
  • 网络销售怎么做才能有业务(新手快速成为老司机的方法)

    最近,一轮轮电商,包括京东、淘宝、甚至以通讯起家的微信也开始投资跨境代购、农产品贸易等尚未开发的「处女地」,网络上又再次掀起一轮轮商战!因此,如何有效在网络上推销商品成了胜负关键,…

    2022年4月29日 专栏投稿
  • 美容整形多少钱(脸颊整容手术)

    全脸都整大概要花多少钱? 由于部位、技术、医院与主刀医生等的不同,整容的价格勘定是有起伏的,不过肯定都在5位数以上,如果想要做个全身的整的话,那么大概的价格大也许在20万左右。 眼…

    2022年5月29日 专栏投稿
品牌推广 在线咨询
返回顶部