I have a problem very similar to that described here: Uploading files using Spring WebFlow 2.4.0, the parameter is not bound , but this one did not mention UTF-8 problems. I am using Spring Framework 4.1.6, Spring Security 4.0.2 and Spring Webflow 2.4.2.
It revolves around StandardServletMultipartResolvervs. CommonsMultipartResolveras far as I can judge, but I'm not sure. If I use CommonsMultipartResolver, I can upload files to any page except Webflow pages, and UTF-8 encoding also works on all pages. However, an exception is thrown on the Webflow pages trying to access the file. If I use StandardServletMultipartResolver, then all files are uploaded, including Webflow, but on any page with a UTF-8 symbol, for example, caractère, I get garbage.
The strangest thing I can see in FireBug is that the file is sent when I use resolons. Also, if I am debugging RequestContext, coming from Webflow, I can also see that the file looks like 4 levels deep in requests. Code for common resolver (see End of message for standard recognizer code):
public FileResult uploadFile(Recipe recipe, RequestContext requestContext) {
ServletExternalContext context = (ServletExternalContext) requestContext.getExternalContext();
MultipartHttpServletRequest multipartRequest = new DefaultMultipartHttpServletRequest((HttpServletRequest)context.getNativeRequest());
MultipartFile file = multipartRequest.getFile("file");
, Spring - Spring? , commons , RequestContext, . .
:
WebMvcConfig
@Bean
public CommonsMultipartResolver filterMultipartResolver() {
CommonsMultipartResolver resolver = new CommonsMultipartResolver();
resolver.setDefaultEncoding("UTF-8");
return resolver;
}
SecurityConfig
@Override
protected void configure(HttpSecurity http) throws Exception {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
http
.addFilterBefore(characterEncodingFilter, CsrfFilter.class)
...more settings...
SecurityInitializer
@Override
protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
insertFilters(servletContext, new MultipartFilter());
}
Webflow
<action-state id="uploadFile">
<evaluate expression="fileActions.uploadFile(recipe, flowRequestContext)"/>
<transition to="review"/>
</action-state>
public FileResult uploadFile(Recipe recipe, RequestContext requestContext) {
ServletExternalContext context = (ServletExternalContext) requestContext.getExternalContext();
MultipartHttpServletRequest multipartRequest = new StandardMultipartHttpServletRequest((HttpServletRequest)context.getNativeRequest());
MultipartFile file = multipartRequest.getFile("file");
...rest of code to save the file...