处理varbinary文件以下载,上传和显示? Primefaces 3.4 - fileupload - filedownload - media

时间:2012-11-18 21:39:13

标签: file-upload primefaces download media varbinary

我使用Glassfish 3.1.2.2,Sql Server 2005,PF 3.4和Mojarra 2.1.6。 Ide Eclipse Juno。

我使用存储过程,并添加jar commons-io.1.4和commons-fileupload.1.2.1

在数据库中,我们将所有文件(pdf,doc,xls等)保存在varbinary中。 我有这些疑惑:

  1. 如何使用 p:fileupload 上传任何文件(pdf,doc,xls等)并保存为 varbinary 文件数据库
  2. 如何使用 p:FileDownload 下载数据库 varbinary 文件?
  3. 如何使用 p:media 显示pdf,从数据库恢复文件 varbinary
  4. 一个问题

    如何使用p:fileupload上传任何文件(pdf,doc,xls等)并将其保存到数据库中?

    我不知道p:fileupload,因为文档。 我使用这个方法handlerFileUpload来上传文件。第一次获得事件的inputScream

    <p:fileUpload fileUploadListener="#{fileBean.handleFileUpload}" />
    
    public class FileBean {
        public void handleFileUpload(FileUploadEvent event) {
           UploadedFile file = event.getFile();
           //application code
        }
    }
    

    我使用了file.getInputStream并向存储过程发送了BinaryStream setBinaryStream(4,inputStream,(int)inputStream.toString()。getBytes()。length);

    这很好??

    两个问题

    如何使用 p:FileDownload 下载任何 varbinary 文件?

    我使用getBytes从数据库恢复varbinary。 请记住我使用存储过程。

    此方法位于具有请求范围的类中。

       public byte[] ArchivoBin(int CDTPEnlaceImagen, int iddoc) {
      Context();
      Null_Rs_and_Proc();
      Connection(0);
      PA(2, 51);
    
      [b]byte[] file = null;[/b]
    
      try {
         setProc(getCon().prepareCall(getCall()));
         getProc().setInt(1, CDTPEnlaceImagen);
         getProc().setInt(2, iddoc);
    
         setRs(getProc().executeQuery());
         getRs().next();
    
         [b]file = getRs().getBytes(1);[/b]
         System.out.println(file);
      }
      catch(SQLException e) {
         System.out.println("Exception ArchivoBin");
         System.out.println(e);
      }
      CloseConnections();
    
      return file;}
    

    但是,当我以字节为单位获取文件时,我将一个字节转换为inputscream,然后将inputcream转换为DefaultStreamedContent。

    这部分是一个有请求范围的类。

    byte[] bytes = null;
    bytes = getRecuperarDatos().ArchivoBin(
                   1, 
                   idarchivo);
    
    //Archivo is a Session Scope
    getArchivo().setFile(new DefaultStreamedContent(
                      [b]new ByteArrayInputStream(bytes)[/b], 
                      "application/pdf", 
                      nomArchivo));
    

    f:download 无法正确显示文件,已损坏。

    <h:commandButton value="Download">
               [b]<p:fileDownload value="#{archivo.file}"[/b] />
            </h:commandButton>
    

    我不知道为什么这么糟糕

    三个问题

    如何使用 p:media 显示pdf,从数据库中恢复 varbinary文件

    这类似于TWO QUESTION,p:媒体说 “加载PDF文档时出错”

1 个答案:

答案 0 :(得分:1)

当我使用方法内容将文件保存在数据库中时,全部解决了。 具体来说,用

public void SubirAlBaseDatos(FileUploadEvent e) {
  bytes[] file = e.getFile().getContents();

);

因此,我可以在p:media中显示,并在p:filedownload中下载。 一些微不足道的东西导致了这个问题。

感谢!! BalusC为您提示 source