无法在iframe JSF

时间:2016-03-28 07:43:42

标签: jsf iframe jsf-2 primefaces

我让用户上传文件并将其存储为

List<Meetingsattachment> mal= new ArrayList<Meetingsattachment>();
    meeting.setMeetingsattachments(mal);

    Random rand=new Random();
    int num=Math.abs(rand.nextInt());
    String dirname="/path/to/files/"+meeting.getDescription()+"-"+num;

    File dir= new File(dirname);
    System.out.println(dir.getAbsolutePath());
     if(! dir.exists()) 
          dir.mkdir();

     for(UploadedFile uf:ufl){
         Meetingsattachment ma=new Meetingsattachment();
         ma.setAttachment(dirname+"/"+uf.getFileName());
         File file = new File(dirname+"/"+uf.getFileName());


            try (FileOutputStream fop = new FileOutputStream(file)) {

                // if file doesn't exists, then create it
                if (!file.exists()) {
                    file.createNewFile();
                }

                // get the content in bytes

                fop.write(IOUtils.toByteArray(uf.getInputstream()));
                fop.flush();
                fop.close();
                meeting.addMeetingsattachment(ma);
                System.out.println("Done");

            } catch (IOException e) {
                e.printStackTrace();
            }


     }

    int meetingid=mrm.addMeeting(meeting);


    return "meetings?faces-redirect=true";

我基本上做的是将文件存储在/ path / to / files /然后将位置存储在我的数据库中,因此db中的值就是这样

/path/to/files/t2-672409104/1.pdf

我可以这样下载文件

Meetingsattachment ma=(Meetingsattachment) actionEvent.getComponent().getAttributes().get("attachment");
        //System.out.println("here  "+form.getRqid());
        try{

        InputStream stream = new FileInputStream(new File(ma.getAttachment()));
        String fl=ma.getAttachment(); 
        System.out.println(fl);
        String filename=fl.split("/")[5];

        //System.out.println(ra.getRaid());
        setFile(new DefaultStreamedContent(stream,"application/pdf",filename));

在jsf

<ui:repeat var="meetattachment" value="#{meet.meetingsattachments}">
                <h:outputText value="#{meetattachment.attachment}" />

                <p:commandButton icon="ui-icon-arrowthickstop-1-s"

                        onclick="PrimeFaces.monitorDownload(showStatus, hideStatus)"
                        actionListener="#{meetBean.buttonAction}">
                        <f:attribute name="attachment" value="#{meetattachment}"></f:attribute>
                        <p:fileDownload value="#{meetBean.file}" />
                    </p:commandButton>

但是当我尝试在iframe中显示该文件时,我只得到一个显示未找到资源的iframe

<ui:repeat var="meetattachment" value="#{meet.meetingsattachments}">
                <h:outputText value="#{meetattachment.attachment}" />                   
                    <p:lightBox iframe="true">
                    <h:outputLink value="#{meetattachment.getAttachment()}">
                    preview2
                    </h:outputLink>
                    </p:lightBox>


                    <br />
            </ui:repeat>

h:outputlink获取的值是/path/to/files/t2-672409104/1.pdf

在开发人员网络控制台中,我可以看到以下错误

GET 
http://localhost:8080/path/to/files/t2-672409104/1.pdf not found

所以我认为问题是它试图用来查找文件的路径,根据我的理解,如果我使用相对路径/ path / to / files存储文件,文件的实际路径是C:\ path \到\文件

我尝试硬编码这样的值只是为了测试

<h:outputLink value="C:\path\to\files\t2-672409104\1.pdf">

我收到一条消息,说它无法理解协议C

所以我的问题基本上是如何提供这些文件的路径以在框架中打开它们

1 个答案:

答案 0 :(得分:-1)

jsf解决链接的方式不同。这就是你找不到文件错误的原因。如果你想在iframe中打开文件,那么你需要做一些额外的工作。有pdfjs库,您可以下载并使用它来显示iframe中的pdf。在primefaces中有一个组件可以做到这一点。您可以使用primefaces源来查看完成相同的操作。如果您想要更多信息或完整的手持,请告诉我。