我使用的是Spring Framework 4.1.5,Spring Security 4.0.0.rc2,Spring Webflow 2.4.0.release和Tomcat 8.0.15。
我遵循了webflow文档中的示例,但无法在表单bean中获取文件。
表单
<form:form action="${flowExecutionUrl}" method="post" commandName="fileForm" enctype="multipart/form-data">
<form:input type="file" value="" path="multipartFileUpload"/>
<button type="submit" name="_eventId_forward"><spring:message code="signup.forward"/></button>
<sec:csrfInput/>
</form:form>
public class FileForm implements Serializable {
private static final long serialVersionUID = 1L;
private transient MultipartFile multipartFileUpload;
public MultipartFile getMultipartFileUpload() {
return multipartFileUpload;
}
public void setMultipartFileUpload(final MultipartFile multipartFileUpload) {
this.multipartFileUpload = multipartFileUpload;
}
}
<view-state id="companyLogo" view="signup/company-logo" model="fileForm">
<var name="fileForm" class="it.openex.pmcommonw.form.FileForm"/>
<transition on="back" to="chooseProfile" bind="false" validate="false"/>
<transition on="forward" to="companyInfo">
<evaluate expression="userCommonBean.uploadImage(fileForm)"/>
</transition>
</view-state>
@Component
public class UserCommonBean {
public static void uploadImage(final FileForm fileForm) throws IOException, ServletException {
fileForm.getMultipartFileUpload(); // always null!!!
}
}
multipartResolver
@Bean
public CommonsMultipartResolver filterMultipartResolver() {
final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(10 * 1024 * 1024);
multipartResolver.setMaxInMemorySize(1048576);
multipartResolver.setDefaultEncoding("UTF-8");
return multipartResolver;
}
webflow配置
@Configuration
public class WebFlowConfig extends AbstractFlowConfiguration {
@Autowired
TilesViewResolver viewResolver;
@Bean
public FlowDefinitionRegistry flowRegistry() {
return getFlowDefinitionRegistryBuilder()
.setFlowBuilderServices(flowBuilderServices())
.setBasePath("/WEB-INF/flows/")
.addFlowLocation("signup.xml", UrlMap.SIGNUP_WEBFLOW)
.addFlowLocation("user-edit.xml", UrlMap.PROFILE_EDIT_WEBFLOW)
.build();
}
@Bean
public FlowExecutor flowExecutor() {
return getFlowExecutorBuilder(flowRegistry()).build();
}
@Bean
public FlowHandlerAdapter flowHandlerAdapter() {
final FlowHandlerAdapter flowHandlerAdapter = new FlowHandlerAdapter();
flowHandlerAdapter.setFlowExecutor(flowExecutor());
return flowHandlerAdapter;
}
@Bean
public FlowHandlerMapping flowHandlerMapping() {
final FlowHandlerMapping flowHandlerMapping = new FlowHandlerMapping();
flowHandlerMapping.setFlowRegistry(flowRegistry());
// this has to be less than -1
flowHandlerMapping.setOrder(-2);
return flowHandlerMapping;
}
@Bean
public MvcViewFactoryCreator mvcViewFactoryCreator() {
final MvcViewFactoryCreator mvcViewFactoryCreator = new MvcViewFactoryCreator();
final List<ViewResolver> viewResolvers = Collections.singletonList(viewResolver);
mvcViewFactoryCreator.setViewResolvers(viewResolvers);
return mvcViewFactoryCreator;
}
@Bean
public FlowBuilderServices flowBuilderServices() {
return getFlowBuilderServicesBuilder().setViewFactoryCreator(mvcViewFactoryCreator())
.setValidator(localValidatorFactoryBean()).build();
}
@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean() {
return new LocalValidatorFactoryBean();
}
}
在Tomcat的context.xml
中,我已经添加了AllowCasualMultiPartParsing=“true”
在requestParameters对象中只有3个对象:
日志中有一些相关行
DEBUG 2015-03-13 18:03:15,053: org.springframework.web.multipart.support.MultipartFilter - Using MultipartResolver 'filterMultipartResolver' for MultipartFilter
DEBUG 2015-03-13 18:03:15,053: org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'filterMultipartResolver'
DEBUG 2015-03-13 18:03:15,053: org.springframework.web.multipart.support.MultipartFilter - Resolving multipart request [/registrazione] with MultipartFilter
DEBUG 2015-03-13 18:03:15,060: org.springframework.web.multipart.commons.CommonsMultipartResolver - Found multipart file [multipartFileUpload] of size 469217 bytes with original filename [PoliziaMunicipale.png], stored in memory
....
DEBUG 2015-03-13 18:03:15,072: org.springframework.binding.mapping.impl.DefaultMapper - Beginning mapping between source [org.springframework.webflow.core.collection.LocalParameterMap] and target [it.openex.pmcommonw.form.FileForm]
DEBUG 2015-03-13 18:03:15,072: org.springframework.binding.mapping.impl.DefaultMapping - Adding mapping result [TargetAccessError@34bc31ea mapping = parameter:'execution' -> execution, code = 'propertyNotFound', error = true, errorCause = org.springframework.binding.expression.PropertyNotFoundException: Property not found, originalValue = 'e1s2', mappedValue = [null]]
DEBUG 2015-03-13 18:03:15,072: org.springframework.binding.mapping.impl.DefaultMapper - Completing mapping between source [org.springframework.webflow.core.collection.LocalParameterMap] and target [it.openex.pmcommonw.form.FileForm]; total mappings = 1; total errors = 1
我不确定它是否有用,但在org.springframework.webflow.context.servlet.HttpServletRequestParameterMap
第52行
if (request instanceof MultipartHttpServletRequest) {
// ... process multipart data
}
检查失败,因为请求是org.springframework.security.web.context.httpsessionsecuritycontextrepository$servlet3SaveTosessionRequestWrapper
的实例
我可以确认MultiPartRequest.getFile(“文件”)也起作用。
但是,我无法启用org.springframework.web.multipart.support.multipartfilter
筛选器。
如果启用了它,multipartRequest是StandardMultiPartTtpServletRequest
的一个实例,它包含一个Servlet3SecurityContextHolderAwarerRequestWrapper
,包装一个Servlet3SaveTosessionRequestWrapper
,最后包含一个无法访问的DefaultMultiPartTtpServletRequest
和我需要的multipartFile。
如果禁用它,我可以获得它,因为multipartRequest成为DefaultMultipartTtpServletRequest
的实例,但没有文件验证,也没有遵守CommonsMultipartResolver
的maxUploadSize限制。
此外,如果Tomcat由于文件太大而启动异常,超出了Tomcat的maxPostSize限制,则该异常将被我的CustomAccessDeniedHandler
捕获,因为其类型为org.SpringFramework.Security.Access.AccessDeniedException
,并且错误消息为在请求参数“_CSRF”或头“x-csrf-token”上找到无效的CSRF令牌“null”。
。
查看request对象,我可以看到原始的Tomcat异常org.apache.Tomcat.util.html" target="_blank">http.FileUpload.FileUploadBase$SizeLimitExcededException
。似乎没有什么可以正确地处理它,但是,正如我所说的,如果我启用MultipartFilter,我就无法获取文件。
我们遇到了同样的问题,因为我们在web应用程序中使用了Spring Security4.xx。问题是org.springframework.security.web.context.httpsessionsecuritycontextropitory$servlet3SaveTosessionRequestWrapper
不是org.springframework.web.multipart.multipartttpservletrequest
的实例,但它包含一个实例。转换为将不起作用,将发生ClassCastException
。
这就是为什么
if (request instanceof MultipartHttpServletRequest) {
// ... process multipart data
}
永远不能是true
。
其想法是从本机httpservletrequest
创建org.springframework.web.multipart.support.StandardMultiparthttpservletrequest
,它可以工作。
在我们的WebApp中,我们使用Spring Webflow文档第6.5.1节中指出的Pojo操作。调用POJO操作。
我们的解决办法:
PojoAction.java
public String fileUpload(RequestContext requestContext) {
final ServletExternalContext context = (ServletExternalContext) requestContext.getExternalContext();
final MultipartHttpServletRequest multipartRequest = new StandardMultipartHttpServletRequest((HttpServletRequest)context.getNativeRequest());
final File file = multipartRequest.getFile("file");
fileUploadHandler.processFile(file); //do something with the submitted file
}
在flow.xml中,我们有一个动作状态,如下所示:
<action-state id="upload-action">
<evaluate expression="pojoAction.uploadFile(flowRequestContext)"/>
<transition to="show"/>
</action-state>
<filter>
<filter-name>csrfFilter</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>csrfFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
问题内容: 我正在使用Spring Framework 4.1.5,Spring Security 4.0.0.RC2,Spring Webflow 2.4.0.RELEASE和Tomcat 8.0.15。 我遵循了webflow 文档中的示例,但是无法在Form Bean中获取文件。 表格 表单豆 流 支持对象 multipartResolver Webflow配置 在Tomcat的内部,我已经
我有一组参数和一组图像,每组参数都包含一个且仅包含一个图像。我的代码 有了这个代码,我可以上传一个图像随着一个parameter.but我想发送数组中的参数和数组中的图像too.is上传数组参数与数组图像的方式?如果是如何跟踪图像和参数?
我正在创建一个接口和链表的实现,如Java1.8: 接口没有编译器问题,但给出了错误其中我有
我正在IIS服务器上使用网站面板。我想使用ftp上载文件 我使用了以下代码: 这段代码运行没有错误。当我使用网站面板的文件管理器时,一个文件创建了“Name.ext”,但这个文件大小是0 KB。为什么?我有什么问题?! 我确信windows防火墙允许我这么做。 更新:我正在使用UploadFileTask和UploadFile(unasync)进行操作,但结果与async相同:(
我正在尝试上传文件与multer和我收到这个错误。 内部/validators.js:117 抛出新的ERR_INVALID_ARG_TYPE(名称,'string',value); ^ TypeError[ERR_INVALID_ARG_TYPE][ERR_INVALID_ARG_TYPE]:“path”参数的类型必须是字符串。接收未定义 当我从angular和Postman两方面尝试时,我面临
问题内容: 我正在尝试为我的数据库实现一个非常基本的搜索引擎,其中用户可能包含各种信息。搜索本身包含几个联合选择,其中结果总是合并为3列。 但是,返回的数据是从不同的表中获取的。 每个查询都使用$ term进行匹配,并将其绑定到“:term”作为预备参数。 现在,该手册说: 调用PDOStatement :: execute()时,对于要传递给语句的每个值,必须包含一个唯一的参数标记。您不能在准备