gpt4 book ai didi

file-upload - Glassfish 4,JSF 2.2和PrimeFaces FileUploadEvent不能一起使用

转载 作者:行者123 更新时间:2023-12-04 13:16:50 25 4
gpt4 key购买 nike

升级到GlassFish 4和JSF 2.2 Primefaces之后,FileUploadEvent停止工作。使用JSF 2.1,它可以毫无问题地工作。除了文件上传之外,其他一切都正常。有什么我想念的吗?

    GlassFish 4
JSF 2.2
PrimeFaces 3.4.2 and 3.5
Commons io version: 2.4
Commons fileupload version: 1.3

Controller 端
public void handleFileUpload(FileUploadEvent event) {
System.out.println("HandleFileUpload");
byte[] file = event.getFile().getContents();
newFieldset.setData(file);
FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}

看法
<h:form enctype="multipart/form-data">
<p:fieldset legend="Create new feed" toggleable="true" collapsed="true" >
<p:fileUpload fileUploadListener="#{adminHomeController.handleFileUpload}" style="margin-top: 20px;"
mode="advanced"
update="messages"
sizeLimit="1000000"
multiple="false"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>
<p:inputText label="Baslik" style="margin-top: 20px;" required="true" value="#{adminHomeController.newFieldset.legend}" />
<p:editor style="margin-top: 20px;"
value="#{adminHomeController.newFieldset.content}" />
<p:commandButton style="margin-top: 20px;" value="#{msg['common.save']}" update="messages" icon="ui-icon-disk" actionListener="#{adminHomeController.saveFieldset()}"/>
</p:fieldset>
<p:growl id="messages" showDetail="true"/>
</h:form>

最佳答案

我终于能够弄清楚了。 Commons-fileuploads方法parseRequest(httpServletRequest)尝试读取请求的inputStream。由于容器已经读取它,因此它是空的。那么如何解决这个问题呢?答案比我最初想象的要复杂一些。首先,您将需要自己的FileUploadFilter,它可能如下所示:

public class FileUploadFilter implements Filter 
{
private final static Logger LOGGER = LoggerFactory.getLogger(FileUploadFilter.class);

/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}

/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
boolean isMultipart = (httpServletRequest.getContentType() == null) ? false : httpServletRequest.getContentType().toLowerCase().startsWith("multipart/");

if (isMultipart)
{
MultipartRequest multipartRequest = new MultipartRequest(httpServletRequest);

LOGGER.info("File upload request parsed succesfully, continuing with filter chain with a wrapped multipart request");

filterChain.doFilter(multipartRequest, response);
}
else
{
filterChain.doFilter(request, response);
}
}

/*
* (non-Javadoc)
*
* @see javax.servlet.Filter#destroy()
*/
@Override
public void destroy()
{
LOGGER.info("Destroying UploadFilter");
}

下一步:在您的web.xml中注册此过滤器,然后删除/替换Primefaces过滤器。看起来应该像这样:
  <filter>
<filter-name>FileUpload Filter</filter-name>
<filter-class><YourPackage>.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

不幸的是,事实并非如此。您将需要自己的MultipartRequest,因为您必须自己组装FileItems的列表。别说了我们必须使用与FileItem不兼容的javax.servlet.Part类。所以我写了一个新的类(class),将这两者联系起来。您可以在这里找到此类: http://pastebin.com/JcfAYjey

最后一个难题是提到的MultipartRequest,它将PartItem和FileUploadFilter链接起来。我从Primefaces-Repository上了这个类(class),并根据需要进行了更改(请参阅 http://pastebin.com/Vc5h2rmJ)。区别在于第47行和第57行之间。

因此,您必须做什么:
1.创建三个类FileUploadFilter,MultipartRequest和PartItem
2.在您的web.xml中注册FileUploadFilter
3.享受!

请注意:这并不是要解决所有问题,而仅仅是您在进一步实现中可能采取的一个方向。例如,MultipartRequest仅适用于内容类型为 image/*的部件。您可能需要更改此设置。

随时更改代码;)希望对您有所帮助!

编辑:我忘了提到一个重要步骤。您还需要您自己的FileIUploadRenderer。一个实现的Primefaces使用 instanceof检查来找到MultipartRequest。由于您现在使用的是另一种,因此必须更改导入。其余的类可以保持不变( http://pastebin.com/rDUkPqf6)。别忘了在您的faces-config.xml中注册它:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.FileUploadRenderer</renderer-type>
<renderer-class><YourPackage>.FileUploadRenderer</renderer-class>
</renderer>
</render-kit>

关于file-upload - Glassfish 4,JSF 2.2和PrimeFaces FileUploadEvent不能一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com