当前位置: 首页 > 面试题库 >

Spring BootThymeleaf Multipart文件上传

解浩渺
2023-03-14
问题内容

我试图创建一个页面,允许用户选择要上传到我的SpringMVC Controller的文件。

这是我的控制器:

@RestController
public class CustomerDataController {

 @RequestMapping(value = "/customerFile", method = RequestMethod.POST)
 public @ResponseBody String handleFileUpload(@RequestParam("myFile") MultipartFile file) {
      if ( !file.isEmpty() ) {
          String name = file.getName();
          try {
              byte[] bytes = file.getBytes();
               BufferedOutputStream stream = new BufferedOutputStream( new FileOutputStream( new File( name + "-uploaded" ) ) );
              stream.write( bytes );
              stream.close();
              return "You successfully uploaded " + name + " into " + name + "-uploaded !";
           catch ( Exception e ) {
                return "You failed to upload " + name + " => " + e.getMessage();
           }
      } else {
           return "The selected file was empty and could not be uploaded.";
      }
  }

我的upload.html表单具有:

 <form action="upload" th:action="@{/customerFile}" method="post" enctype="multipart/form-data">
      <input type="file" name="myFile" />
      <input type="submit" />
 </form>

我也尝试过使用标准格式(非Thymeleaf格式):

 <form method="post" action="/customerFile" enctype="multipart/form-data">
      <input type="file" name="file"/>
      <input type="submit"/>
 </form>

不知道它是否相关,但是我有以下配置:

 @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       ...
        registry.addViewController( "/upload" ).setViewName( "upload" );
    }

@Bean
    MultipartConfigElement multipartConfigElement() {
        MultiPartConfigFactory factory = new MultiPartConfigFactory();
        factory.setMaxFileSize("512KB");
        factory.setMaxRequestSize("512KB");
        return factory.createMultipartConfig();
    }

我的build.gradle中包含以下内容:

apply plugin: 'java'
apply plugin: 'groovy'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'jacoco'
apply plugin: 'war'

repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/libs-snapshot" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.springframework.boot:spring-boot-starter-data-jpa:1.0.0.RC4")
    compile("org.springframework:spring-orm:4.0.0.RC1")
    compile("org.hibernate:hibernate-entitymanager:4.2.1.Final")
    compile("com.h2database:h2:1.3.172")
    compile("joda-time:joda-time:2.3")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("org.codehaus.groovy.modules.http-builder:http-builder:0.7.1")
    compile('org.codehaus.groovy:groovy-all:2.2.1')
    compile('org.jadira.usertype:usertype.jodatime:2.0.1')

    testCompile('org.spockframework:spock-core:0.7-groovy-2.0') {
        exclude group: 'org.codehaus.groovy', module: 'groovy-all'
    }
    testCompile('org.codehaus.groovy.modules.http-builder:http-builder:0.7+')
    testCompile("junit:junit")
}

我正在运行嵌入式Tomcat,通过以下方式启动:

public static void main(String[] args) {
        ApplicationContext ofac = SpringApplication.run( OFAC.class, args );
}

单击提交按钮时,在控制器中没有看到请求,但在浏览器中显示以下内容:

HTTP Status 400 - Required MultipartFile parameter 'myFile' is not present

type Status report

message Required MultipartFile parameter 'myFile' is not present

description The request sent by the client was syntactically incorrect.
Apache Tomcat/7.0.52

这是Firebug告诉我有关请求的内容:

connection  close
Content-Language    en
Content-Length  1080
Content-Type    text/html;charset=utf-8
Date    Mon, 24 Mar 2014 17:09:55 GMT
Server  Apache-Coyote/1.1
Request Headersview source
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Cookie  JSESSIONID=86768954CD2877A7D78535E26CFFB8DA
DNT 1
Host    localhost:9001
Referer http://localhost:9001/upload

问题答案:

解决方法是更新Spring Boot(修复了multipart autoconfig中的一个错误,所以很可能就是这样)。



 类似资料:
  • 在Yii里上传文件通常使用 yii\web\UploadedFile 类, 它把每个上传的文件封装成 UploadedFile 对象。 结合 yii\widgets\ActiveForm 和 models,你可以轻松实现安全的上传文件机制。 创建模型 和普通的文本输入框类似,当要上传一个文件时,你需要创建一个模型类并且用其中的某个属性来接收上传的文件实例。 你还需要声明一条验证规则以验证上传的文件

  • 大多数的 Web 应用都不可避免的,会涉及到文件上传。文件上传,不过是一种适配 HTTP 输入流的方式。 为此,Nutz.Mvc 内置了一个专门处理文件上传的适配器 org.nutz.mvc.upload.UploadAdaptor 这个适配器专门解析形式为 <form target="hideWin" enctype="multipart/form-data" method="post">

  • 哦,上传文件可是个经典的好问题了。文件上传的基本概念实际上非常简单, 他基本是这样工作的: 一个 <form> 标签被标记有 enctype=multipart/form-data ,并且 在里面包含一个 <input type=file> 标签。 服务端应用通过请求对象上的 files 字典访问文件。 使用文件的 save() 方法将文件永久地 保存在文件系统上的某处。 一点点介绍 让我们建立一

  • Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中 Paginator对象 Paginator(列表,int):返回分页对象,参数为列表数据,每面数据的条数 属性 count:对象总数 num_pages:页面总数 page_range:页码列表,从1开始,例如[1, 2, 3, 4] 方法 page(num):下标以1开始,如果提供的页码不存在

  • SDK 详细代码可参考sdk-java模块代码,位于单元测试文件中 /** * 上传文件,读取本地文件 * * @throws IOException */ @Test public void testUpload() throws IOException { FileUploadRequest request = new F

  • 请求接口时带上文件 客户端调用 DemoFileUploadRequest request = new DemoFileUploadRequest(); DemoFileUploadModel model = new DemoFileUploadModel(); model.setRemark("上传文件参数"); request.setBizModel(model); List<Upload

  • ThinkCMF封装了文件上传,开发者只要在模板中使用已经封装好的 js 方法就可以了,相关方法在 admin.js和frontend.js,相关函数如下: 上传对话框 /** * 打开文件上传对话框 * @param dialog_title 对话框标题 * @param callback 回调方法,参数有(当前dialog对象,选择的文件数组,你设置的extra_params) * @

  • 接口说明 顺序上传文件的所有分片 API地址 POST /api/upload/1.0.0/upload 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 dataguid string form 是 数据标识 file MultipartFile form 是 上传的文件 响应字段说明 参数 类型 说明 md5 String 文件md5校验码 响应成功示例 { "code