我将Spring Boot版本='1.4.0.rc1'与Spring Boot Stormpath 1.0.2一起使用。
我试图使用多部分文件上传,但MultipartFile在控制器中总是为空。
这是控制器,在下面的代码中,checknotnull(part)
总是成功,checknotnull(imageFile)
总是失败:
@PostMapping("{username}/profilePhoto")
public ResponseEntity<?> saveProfilePhoto(@PathVariable("username") String username,
@RequestPart(name = "file", required = false) MultipartFile imageFile,
HttpServletRequest request) {
try {
Part part = request.getPart("file");
checkNotNull(part);
checkNotNull(imageFile);
} catch (IOException | ServletException ex) {
throw InternalServerErrorException.create();
}
// Transfer the multipart file to a temp file
File tmpFile;
try {
tmpFile = File.createTempFile(TMP_FILE_PREFIX, null);
imageFile.transferTo(tmpFile);
} catch (IOException ex) {
log.error("Failed to create temp file", ex);
throw InternalServerErrorException.create();
}
// Execute the use case
updateUserProfilePhoto.execute(username, tmpFile);
// Delete the temp file
FileUtils.deleteQuietly(tmpFile);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
我的集成测试使用改型:
@Multipart
@POST("users/{username}/profilePhoto")
Call<Void> uploadProfilePhoto(@Path("username") String username,
@Part("file") RequestBody profilePhoto);
...
@Test
public void saveProfilePhoto_shouldSavePhoto() throws IOException {
// Given
String usernamme = usernames[0];
Resource testImageResource = context.getResource("classpath:images/test_image.jpg");
File imageFile = testImageResource.getFile();
RequestBody body = RequestBody.create(okhttp3.MediaType.parse("image/*"), imageFile);
// When
Response<Void> response = getTestApi().uploadProfilePhoto(usernamme, body).execute();
// Then
assertThat(response.code()).isEqualTo(201);
}
我使用自动配置,所以我唯一的自定义配置类配置StormPath:
@Configuration
public class SpringSecurityWebAppConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.apply(stormpath());
}
}
更新:这是传出请求。我不确定如何在多部分解析器本身中启用日志记录。
2016-08-18 14:44:14.714 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : --> POST http://localhost:8080/users/user1/profilePhoto http/1.1
2016-08-18 14:44:14.714 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Content-Type: multipart/form-data; boundary=fe23ef21-3413-404c-a260-791c6921b2c6
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Content-Length: 181212
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Accept: application/json
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : Authorization: Bearer [token]
2016-08-18 14:44:14.715 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 :
2016-08-18 14:44:14.735 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : --fe23ef21-3413-404c-a260-791c6921b2c6
Content-Disposition: form-data; name="file"
Content-Transfer-Encoding: binary
Content-Type: image/*
Content-Length: 180999
file data
--fe23ef21-3413-404c-a260-791c6921b2c6--
2016-08-18 14:44:14.762 DEBUG 13088 --- [ main] c.t.server.web.testutil.TestConfig$1 : --> END POST (181212-byte body)
对发生了什么有什么想法吗?
您必须启用Spring多部分解析器,因为默认情况下Spring不启用多部分功能。
默认情况下,Spring不进行多部分处理,因为一些开发人员希望自己处理多部分。您可以通过向web应用程序的上下文添加一个多部分解析器来启用Spring多部分处理。
您需要将以下bean添加到您的配置类中:
@Bean
public MultipartResolver multipartResolver() {
return new CommonsMultipartResolver();
}
*更新*因为我以前的答案是不正确的,根据评论。下面是一个我能够成功运行的更新示例。
@SpringBootApplication
public class StackoverflowWebmvcSandboxApplication {
public static void main(String[] args) {
SpringApplication.run(StackoverflowWebmvcSandboxApplication.class, args);
}
@Controller
public class UploadPhoto {
@PostMapping("{username}/profilePhoto")
public ResponseEntity<String> saveProfilePhoto(@PathVariable("username") String username,
@RequestPart(name = "file", required = false) MultipartFile imageFile, HttpServletRequest request) {
String body = "MultipartFile";
if (imageFile == null) {
body = "Null MultipartFile";
}
return ResponseEntity.status(HttpStatus.CREATED).body(body);
}
}
}
这是一个非常基本的测试,没有特殊的东西。然后我创建了一个邮递员请求,下面是curl调用示例:
curl -X POST -H "Cache-Control: no-cache" -H "Postman-Token: 17e5e6ac-3762-7d45-bc99-8cfcb6dc8cb5" -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" -F "file=@" "http://localhost:8080/test/profilePhoto"
响应是multipartfile
,这意味着它不是null,在这一行上进行调试会显示变量是用我上传的图像填充的。
下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!
我有两个不同的活动,在第一个活动中,我在一些EditText中输入一些信息,然后进入第二个活动,但当我返回时,第一个活动中EditText上的文本消失了。 以下是第一个活动的OnCreate() 我正在使用onSaveInstanceState方法保存信息 在进行调试时,我可以看到确实在onSaveInstanceState方法中填充了savedInstanceState捆绑包,但在OnCreat
问题内容: 我正在编写一个C#ASP.Net MVC应用程序,供客户端将文件发布到其他服务器。我正在使用通用处理程序来处理从客户端到服务器的发布文件。但是在我的处理程序中,System.Web.HttpContext.Current.Request.Files始终为空(0个计数)。 表格代码: 处理程序: 请帮我。谢谢。 问题答案: 最后,我发现了问题。 由于某些原因,控制器中的代码永远无法正常工
问题内容: 我使用firefox 3.6.10和firebug进行调试 所以,这是我的代码: responseXML 始终为null,我已经尝试了来自不同域的多个URL。我也异步地尝试过,结果是一样的。该 responseText的 总是正确返回,与它没有任何问题。 我的目标是获取 responseXML.documentElement 。 谢谢你的帮助。 编辑----------- 此javas
问题内容: 我不知道我的代码正在发生什么。我没有错误,也没有回应。我正在将数据写入串行端口,并通过激活等待响应, 但未触发此事件,inputstream.available()始终返回0。可能是什么问题?我在Linux中使用RXTX。 编辑 我在主要方法上打开端口,并在应用程序内的按钮单击事件上发送消息。 问题答案: 不能用于进程间通信(包括串行),因为它仅检查当前进程中(输入缓冲区中)是否有可用
问题内容: 我尝试@Inject这样的字段(它是一个jar模块,在META-INF下存在空bean.xml): IDataProvider接口 数据提供者实现import javax.enterprise.context.ApplicationScoped; 我尝试注入DataProvider的类 如果我在Wildfly上运行此命令,则注入的dataProvider始终为null(DataCont