当前位置:首页 > 生活百科

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

栏目:生活百科日期:2025-05-24浏览:0

零、本篇要点

介绍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 */@Controllerpublic 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

&<html xmlns:th="http://www.thymeleaf.org"&>    &<!--suppress ALL--&>&<html lang="en"&>    &<head&>        &<meta charset="UTF-8"&>        &<title&>文件上传界面&</title&>    &</head&>    &<body&>        &<p&>            &<form method="POST" enctype="multipart/form-data" action="/upload"&>                &<table&>                    &<tr&>&<td&>&<input type="file" name="file" /&>&</td&>&</tr&>                    &<tr&>&<td&>&</td&>&<td&>&<input type="submit" value="上传" /&>&</td&>&</tr&>                &</table&>            &</form&>        &</p&>    &</body&>&</html&>

3、编写页面uploadStatus.html

&<!--suppress ALL--&>&<html xmlns:th="http://www.thymeleaf.org"&>&<html lang="en"&>    &<head&>        &<meta charset="UTF-8"&>        &<title&>文件上传界面&</title&>    &</head&>    &<body&>        &<p th:if="${msg}"&>            &<h3 th:text="${msg}"/&>        &</p&>        &<p &>            &<img class="aligncenter" src="" th:src="${url}" alt=""&>        &</p&>    &</body&>&</html&>

4、编写配置

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

5、配置虚拟路径映射

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

@Configurationpublic 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,并且页面也成功显示:

四、SpringBoot的Restful风格,返回url

/** * 文件上传 * * @author Summerday */@RestControllerpublic 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&<String,Object&> singleFileUpload(@RequestParam("file") MultipartFile file) throws Exception {        if (file.isEmpty()) {            throw new Exception("文件为空!");        }        String filename = upload(file);        String url = "/upload/" + filename;        Map&<String,Object&> 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);    }}

“spring文件上传大小限制(spring上传到文件服务器)” 的相关文章

2020最值得买的3部手机(每一部性价比都很高)

目前公认最值得购买的3部手机,你买了哪一部?第一部手机:iPhone11苹果手机向来都是很受欢迎,只要售价更低,就可以卖得很火爆,变成“真香机”。iPhoneX...

一般纳税人增值税怎么算,一般纳税人计税公式

现行的增值税的计税方法有三种,即一般计税方法、简易计税方法和扣缴计税方法:1、一般计税方法(购进扣税法)适用于一般纳税人当期的应纳增值税额=当期销项税额-当期进...

创新企业有哪些模式(创新的四种模式分析)

产品,一个企业生存与发展的源泉,不同于营销及商业模式能带来的短暂收益,更追求长久的营收。一个企业能否持续不断地进行产品创新,洞察市场需求,不断根据用户反馈迭代产...

公司网站要备案(个人网站备案流程 )

企业建站_公司网站建设需要进行网站备案吗?这个问题应该是很多企业老板都想要问的问题吧。网站服务器有二种:一种是国外的服务器,如香港服务器等,这些国外的服务器就不...

2020最好的超长焦相机多少钱(5款超长焦相机品牌报价)

这些搭载远摄固定镜头的相机无论在外观还是使用感受上都类似于数码单反相机,具有超级变焦的范围,关键是其中有很多机型的价格非常优惠。那么你可能想问,为什么不是所有的...

cad菜单栏不见了怎么显示出来(分享cad菜单栏操作技巧)

对于一些CAD小白来说,菜单栏有时候不小心关闭了,又不知道怎么调出来,又得自己去网上到处搜教程,今天就给大家介绍一下方法:1,在CAD最上面有个倒三角的图标,我...

ios个人开发者账号申请要多久(苹果id开发者账号申请条

iOS打包方式的选择1.SaveforiOSAppStoreDeployment该方式必须使用$99的公司账号或者个人账号。通过该账号下的Distributio...

台湾特色甜品小吃,游台湾必吃必买的十种特色点心

抹茶第一站抹茶千层蛋糕如果你也喜欢千层蛋糕层层堆叠交错出的绵密厚实口感,“和茗甘味处”的抹茶千层蛋糕绝对能深得你心!饼皮吃来很有弹性,与鲜奶油紧密贴合,加了抹茶...

冼燕坚个人资料多少岁(曝光冼燕坚各种隐私)

每天刷抖音的朋友,想必都看过这样一对夫妇。男的邋里邋遢,穿着寒酸。女的妆容精致,气质高冷。很特别的是,他们的手里、腰里,总是有大把的房子钥匙。而这对奇怪的组合,...

剑网三花钱吗怎么买划算(剑网三手游平民职业推荐)

游戏《剑网三》,一般休闲玩玩,并不需要花什么钱。路人氛围确实不错,但是阵营是对立的,是pvp的一种玩法,就是把玩家划分为红方蓝方,有不同的设定和立场,从而进行游...