- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 PrimeFaces 上传文件,但 fileUploadListener
上传完成后不会调用方法。
这是 View :
<h:form>
<p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"
mode="advanced"
update="messages"
sizeLimit="100000"
allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>
<p:growl id="messages" showDetail="true"/>
</h:form>
@ManagedBean
@RequestScoped
public class FileUploadController {
public void handleFileUpload(FileUploadEvent event) {
FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
mode="simple"
和
ajax="false"
,它已被调用,但我希望它在高级模式下工作。我正在使用 Netbeans 和 Glassfish 3.1。
最佳答案
如何配置和故障排除 <p:fileUpload>
取决于 PrimeFaces 和 JSF 版本。
所有 PrimeFaces 版本
以下要求适用于所有 PrimeFaces 版本:
enctype
<h:form>
的属性需要设置为 multipart/form-data
.如果不存在,ajax 上传可能会正常工作,但一般浏览器行为未指定并取决于表单组合和 webbrowser 制作/版本。只是总是指定它是安全的。mode="advanced"
(即ajax上传,这是默认的),然后确保你有一个<h:head>
在(主)模板中。这将确保正确包含必要的 JavaScript 文件。这对于 mode="simple"
不是必需的(非 ajax 上传),但这会破坏所有其他 PrimeFaces 组件的外观和功能,因此无论如何您都不想错过。mode="simple"
(即非ajax上传),则必须通过ajax="false"
在任何PrimeFaces命令按钮/链接上禁用ajax ,并且您必须使用 <p:fileUpload value>
与 <p:commandButton action>
而不是 <p:fileUpload listener>
.<h:head>
!):
<h:form enctype="multipart/form-data">
<p:fileUpload listener="#{bean.upload}" auto="true" /> // For PrimeFaces version older than 8.x this should be fileUploadListener instead of listener.
</h:form>
public void upload(FileUploadEvent event) {
UploadedFile uploadedFile = event.getFile();
String fileName = uploadedFile.getFileName();
String contentType = uploadedFile.getContentType();
byte[] contents = uploadedFile.getContents(); // Or getInputStream()
// ... Save it, now!
}
或者如果你想要非ajax文件上传:
<h:form enctype="multipart/form-data">
<p:fileUpload mode="simple" value="#{bean.uploadedFile}" />
<p:commandButton value="Upload" action="#{bean.upload}" ajax="false" />
</h:form>
private transient UploadedFile uploadedFile; // +getter+setter
public void upload() {
String fileName = uploadedFile.getFileName();
String contentType = uploadedFile.getContentType();
byte[] contents = uploadedFile.getContents(); // Or getInputStream()
// ... Save it, now!
}
请注意与ajax相关的属性,例如
auto
,
allowTypes
,
update
,
onstart
,
oncomplete
等是
忽略 在
mode="simple"
.所以在这种情况下不需要指定它们。
java.io.FileNotFoundException
结束。在临时文件上。
listener
而不是(就像 8.x 之前的版本一样)
fileUploadListener
.
faces-config.xml
,则需要任何额外的配置也声明符合 JSF 2.2 版本。你做
不是 完全需要 PrimeFaces 文件上传过滤器,您也可以这样做
不是 需要
primefaces.UPLOADER
web.xml
中的上下文参数.如果您不清楚如何根据所使用的目标服务器正确安装和配置 JSF,请前往
How to properly install and configure JSF libraries via Maven?和
"Installing JSF" section of our JSF wiki page .
web.xml
中手动注册以下 PrimeFaces 文件上传过滤器(它将解析多部分请求并填充常规请求参数映射,以便
FacesServlet
可以继续照常工作):
<filter>
<filter-name>primeFacesFileUploadFilter</filter-name>
<filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>primeFacesFileUploadFilter</filter-name>
<servlet-name>facesServlet</servlet-name>
</filter-mapping>
<servlet-name>
facesServlet
的值必须与
<servlet>
中的值完全匹配
javax.faces.webapp.FacesServlet
的条目在同一
web.xml
.所以如果它是例如
Faces Servlet
,那么您需要相应地编辑它以匹配。
UploadedFile#getContents()
获取上传的文件内容只有一个潜在的问题.这将返回
null
当使用 native API 而不是 Apache Commons FileUpload 时。您需要使用
UploadedFile#getInputStream()
相反。另见
How to insert uploaded image from p:fileUpload as BLOB in MySQL?
web.xml
中明确注册文件上传过滤器.
commons-fileupload.jar
commons-io.jar
/WEB-INF/lib
文件夹。
web.xml
:
<context-param>
<param-name>primefaces.UPLOADER</param-name>
<param-value>commons</param-value><!-- Allowed values: auto, native and commons. -->
</context-param>
Filter
在您的 web 应用程序中,该应用程序在 PrimeFaces 文件上传过滤器之前运行并且已经通过例如消耗了请求正文调用 getParameter()
, getParameterMap()
, getReader()
等。一个请求体只能被解析一次。当您在文件上传过滤器完成其工作之前调用这些方法之一时,文件上传过滤器将获得一个空的请求正文。<filter-mapping>
web.xml
中其他过滤器之前的文件上传过滤器.如果请求不是 multipart/form-data
请求,然后文件上传过滤器将继续,好像什么也没发生。如果您使用自动添加的过滤器,因为它们使用注释(例如 PrettyFaces),您可能需要通过 web.xml 添加显式排序。见 How to define servlet filter order of execution using annotations in WARFilter
在您的 webapp 中,它在 PrimeFaces 文件上传过滤器之前运行并执行了 RequestDispatcher#forward()
打电话。通常,URL 重写过滤器,例如 PrettyFaces这样做。这会触发 FORWARD
调度程序,但过滤器默认监听 REQUEST
仅调度员。FORWARD
调度员也是: <filter-mapping>
<filter-name>primeFacesFileUploadFilter</filter-name>
<servlet-name>facesServlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<h:form>
.这在 HTML 中是非法的,浏览器行为未指定。通常,浏览器不会在提交时发送预期的数据。确保您没有嵌套 <h:form>
.这完全不考虑表单的 enctype
.只是不要嵌套表单。FileUploadRenderer#decode()
上放置断点并从那里前进。
关于jsf - 如何使用 PrimeFaces p :fileUpload? 从未调用监听器方法或 UploadedFile 为空/引发错误/不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875818/
我目前正在开发一个应用程序,用户可以选择浏览和上传 Excel 文件,但我很难获取正在浏览的文件的绝对路径。因为位置可以是任何东西(Windows/Linux)。 import org.apache.
在 Ubuntu 服务器上部署我的 Laravel 代码后,我有以下函数返回空字符串: $package = $request->file('file'); dd($package->getPathn
这个问题在这里已经有了答案: How to use PrimeFaces p:fileUpload? Listener method is never invoked or UploadedFile
我阅读了以下 django 文档 UploadedFile.content_type The content-type header uploaded with thefile (e.g. text/
我正在寻找一个 javascript/jquery(无论哪种方式)来收集我上传的所有文件。 我有以下代码,其中 .afbeelding 是几个文件输入字段的类 var geuploadeAfbeeld
我有一个 Laravel 4.2 API,它在创建资源时接受文件上传。该文件检索与Input::file('文件') 现在我想编写一个脚本(也在 Laravel 中)来批量创建一些资源(所以我不能使用
我正在尝试从现有文件创建一个 UploadedFile。但它没有成功上传,也没有显示任何错误。 这是我的代码 $encoded_data = "This is a huge string";
我正在使用 上传文件(图片)在代码隐藏中我使用 UploadedFile.SaveAs("C://Path...")将图像保存在服务器上。 这是我的完整代码: protected void btnA
当我的表单被发送时 UploadedFile::getInstance($model, 'images') 返回 null。我还尝试了 UploadedFile::getInstanceByName(
我在 symfony2 中使用 UploadedFile 类来上传图像文件。我允许使用 mime 类型 image/jpg 和 image/png 的图像。当我将 png 文件从我的系统上传到服务器时
我正在使用 PrimeFaces 3.2,我应该在文件系统上存储一个文件。 现在,我知道 FileUploaded 类创建了一个临时文件,因此我可以使用 java.io.File 将其转换为真实文件。
我有以下函数定义: public function save(UploadedFile $file, string $fileSystemName) { $fs = $this->fileSy
我正在构建文件上传没有 Doctrine 并且没有通过我可用的注释或 YAML 进行验证。 Symfony 将上传的文件呈现为 Symfony\Component\HttpFoundation\Fil
我正在构建文件上传没有 Doctrine 并且没有通过我可用的注释或 YAML 进行验证。 Symfony 将上传的文件呈现为 Symfony\Component\HttpFoundation\Fil
我有一个包含 CSV 数据的巨大字符串。我想将其转换为 Excel 文件 (.xslx) 并将其另存为 UploadedFile/SimpleUploadedFile。我尽可能地用谷歌搜索并得出以下结
我正在学习本教程 http://symfony.com/doc/current/controller/upload_file.html但是 $file 没有被转换为 UploadedFile,它仍然是
PrimeFaces UploadedFile 仅公开 InputStream,不公开文件本身。处理流后如何删除它? 最佳答案 为此,PrimeFaces 在幕后使用 Apache Commons F
我尝试发送附件文件,但我得到 Cannot use object of type Illuminate\Http\UploadedFile as array 我使用 Laravel 5.4 有人知道我
有没有办法将字符串转换成ActionDispatch::Http::UploadedFile 我需要它能够在 API 请求中传递文件路径以处理将 excel 插入数据库,因为我想使用 rest API
我使用了与importing csv and excel Railscast类似的想法,但是由于该情节中的标准代码需要一些时间来处理(使用ActiveRecord为文件中的每一行创建新记录),我在He
我是一名优秀的程序员,十分优秀!