我在网络应用程序中包含了一个PDF查看器,可以在Chrome中正常运行。
但网络必须与IE8或更高版本兼容。
而且,遗憾的是,观众在IE中抛出错误,在任何版本中(总是如此友好......)
我正在使用Primefaces 3.4.1(抱歉,我无法更改版本)
代码:
uploadedView.xhtml :( Eplanation:逻辑在向导中分两步进行;首先进行上传,第二步进行查看)
<p:wizard widgetVar="wizard" flowListener="#{fileBean.onFlowProcess}" >
<p:tab id="upload" title="Upload docs">
<p:panel header="Upload a PDF">
<p:growl id="messages" showDetail="true" />
<p:panelGrid columns="2">
<p:fileUpload id="fileUploaded" value="#{fileBean.file}" mode="simple"/>
<p:commandButton actionListener="#{fileBean.upload}" value="Upload" ajax="false"/>
</p:panelGrid>
</p:panel>
</p:tab>
<p:tab id="view" title="View the uploaded doc">
<p:panel header="View here the doc">
<p:media value="#{fileBean.streamedContent}" width="100%" height="500px" player="pdf" rendered="#{fileBean.streamedContent != null}"/>
</p:panel>
</p:tab>
</p:wizard>
fileBean.java :
@ManagedBean
@SessionScoped
public class FileBean implements Serializable{
static final long serialVersionUID = 42L;
private UploadedFile file;
private String fileName;
private StreamedContent streamedContent;
private InputStream stream;
public UploadedFile getFile() {
return file;
}
public void setFile(UploadedFile file) {
this.file = file;
}
public void upload() {
if(file != null) {
// Saving the stream after uploading
byte[] b = file.getContents();
stream = new ByteArrayInputStream(b);
stream.mark(0); //remember to this position!
streamedContent = new DefaultStreamedContent(stream, "application/pdf");
}
}
public StreamedContent getStreamedContent() throws IOException {
// Getting the stream data
if (file == null || file.getSize() == 0){
return new DefaultStreamedContent();
} else {
if (streamedContent != null)
streamedContent.getStream().reset(); //reset stream to the start position!
return streamedContent;
}
}
public String onFlowProcess(FlowEvent event) {
// Flow for wizard
if (event.getNewStep() == null || event.getNewStep().isEmpty()){
return event.getOldStep();
}
if (file == null || file.getSize() == 0) {
return "not file";
} else {
return event.getNewStep();
}
}
在Chrome中,服务器只显示此警告,但查看器工作正常:
ADVERTENCIA:JSF1091:no se haencontradoingún要么MIME para el archivo dynamiccontent。 Para resolverlo,agregueunasignacióndetipo MIME al archivo web.xml delaaplicación。
(Traslation:总之,dynamiccontent中缺少MIME类型)
但在IE中,除此之外,还会显示下一个:
13-oct-2014 17:52:53 org.primefaces.application.PrimeResourceHandler handleResourceRequest GRAVE:流式动态资源出错。 Laexpresiónnopuede ser nula
(Traslation:Expression不能为空)
观众在浏览器中弹出一个弹出窗口:
文件不以'%PDF-“等开头......
最重要的是,我不明白为什么服务器在IE上抛出异常。
抱歉我的英文和..
问候!
答案 0 :(得分:1)
经过研究,我的结论是:
- &GT; IE中似乎不可能从Managed Bean流式传输。
两种选择:
智能选项:创建一个servlet来管理文件treaming,如下所示(查看 @BalusC 回答: Unable to show PDF in p:media generated from streamed content in Primefaces)
另一个有效选项:首先,我们将pdf文件存储在服务器中,然后显示它只是指示网址
问候