2017-01-01 97 views
0

我想從露天使用路徑下載文檔,但我得到的內容長度爲空,圖像可以在瀏覽器中下載,但沒有任何顯示。任何人都可以指出我做錯了什麼。使用opencmis從露天下載文檔

import java.io.BufferedInputStream; 
    import java.io.BufferedOutputStream; 
    import java.io.DataInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.io.PrintWriter; 
    import java.util.HashMap; 
    import java.util.Map; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import org.apache.chemistry.opencmis.client.api.CmisObject; 
    import org.apache.chemistry.opencmis.client.api.Document; 
    import org.apache.chemistry.opencmis.client.api.Folder; 
    import org.apache.chemistry.opencmis.client.api.Session; 
    import org.apache.chemistry.opencmis.client.api.SessionFactory; 
    import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl; 
    import org.apache.chemistry.opencmis.commons.PropertyIds; 
    import org.apache.chemistry.opencmis.commons.SessionParameter; 
    import org.apache.chemistry.opencmis.commons.data.ContentStream; 
    import org.apache.chemistry.opencmis.commons.enums.BindingType; 
    public class TestServlet extends HttpServlet { 

    private static final String ALFRSCO_ATOMPUB_URL = "http://localhost:8484/alfresco/cmisatom"; 
    private static final String REPOSITORY_ID = "cf9aacff-a023-477f-a7e1-a8a901cf0b27"; 
    /** 
    * Processes requests for both HTTP <code>GET</code> and <code>POST</code> 
    * methods. 
    * 
    * @param request servlet request 
    * @param response servlet response 
    * @throws ServletException if a servlet-specific error occurs 
    * @throws IOException if an I/O error occurs 
    */ 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     try (PrintWriter out = response.getWriter()) { 
      /* TODO output your page here. You may use following sample code. */ 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet TestServlet</title>");    
      out.println("</head>"); 
      out.println("<body>"); 
      out.println("<h1>Servlet TestServlet at " + request.getContextPath() + "</h1>"); 
      out.println("</body>"); 
      out.println("</html>"); 
      Map<String, String> parameter = new HashMap<String, String>(); 

     // Set the user credentials 
     parameter.put(SessionParameter.USER, "admin"); 
     parameter.put(SessionParameter.PASSWORD, "admin"); 

     // Specify the connection settings 
     parameter.put(SessionParameter.ATOMPUB_URL, ALFRSCO_ATOMPUB_URL); 
     parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value()); 

     //Add repository Id 
     parameter.put(SessionParameter.REPOSITORY_ID, REPOSITORY_ID); 
     // Create a session 
     SessionFactory factory = SessionFactoryImpl.newInstance(); 
     Session session = factory.getRepositories(parameter).get(0).createSession(); 
     System.out.println("Connected to repository:" + session.getRepositoryInfo().getName()); 
     Folder root = session.getRootFolder(); 
     System.out.println("Repository Name: "+root.getName()+"id: "+session.getRepositoryInfo().getId()); 

// (minimal set: name and object type id) 

String path1 = "/Hello/img.jpg"; 
    Document doc = (Document) session.getObjectByPath(path1); 
    System.out.println(doc.getId()+" docname: "+doc.getName());// docId=workspace://SpacesStore/669bd07f-7a3d-471c-b6f3-bff6764f827e 
    // String fullPath= "/Hello" + "/imgss.png"; 
     Document doc1 = (Document)session.getObject(doc.getId()); 

    // CmisObject obj=doc1; 
     Document newDocument = (Document) session.getObjectByPath(path1); 
     System.out.println(newDocument.getId()); 

     //File file = new File(home+"/Downloads/" + fileName + ".txt"); 
     response.setContentType("application/force-download"); 

     //response.setContentLength(-1); 
     response.setContentType("application/octet-stream"); 

     response.setHeader("Content-Transfer-Encoding", "binary"); 
     response.setHeader("Content-Disposition","attachment; filename=img.jpg");//fileName); 

     try { 
        ContentStream cs = doc1.getContentStream(null); 
        System.out.println("buffered content: "+cs); 

        BufferedInputStream in =new BufferedInputStream(cs.getStream()); 
       // FileOutputStream fos = new FileOutputStream(home); 
       // OutputStream bufferedOutputStream = new BufferedOutputStream(fos); 
         System.out.println("buffered outputstream: "+in); 

        DataInputStream din = new DataInputStream(in); 

        while(din.available() > 0){ 
        out.print(din.readLine()); 
         out.print("\n"); 
          } 
        din.close(); 
        in.close(); 
     } 
     catch (IOException e) 
     { 
     throw new RuntimeException(e.getLocalizedMessage()); 
     } 
     } 
    } 

    } 

輸出,我在控制檯有:

Connected to repository:Main Repository 
Repository Name: Company Homeid: 4cdc8cd1-ddf1-4e30-95f8-4a2219073580 
workspace://SpacesStore/2284cd59-8480-40fa-baed-05d54ddfc561;1.0 docname: imgss.png 
workspace://SpacesStore/2284cd59-8480-40fa-baed-05d54ddfc561;1.0 
buffered content: ContentStream [filename=imgss.png, length=null, MIME type=image/png, has stream=true][extensions=null] 
buffered outputstream: [email protected] 

圖片在露天:

enter image description here

圖片我已經下載是:

enter image description here

回答

1

在戶外,你可以使用到的方法

在我的解決方案下載一個文件,你將使用

serverUrl : "http://127.0.0.1:8080/alfresco/api/-default-/public/cmis/versions/1.0/atom"; 

username : admin 

password : admin 

第一種方式:使用文檔ID

文檔的ID是當我們在Alfresco上傳它時,Alfresco爲這個文件修復的ID

public static void downloadDocumentByID(String serverUrl, String username, String password ,String documentID,String fileName,String destinationFolder){ 
     String fullPath= destinationFolder + fileName; 
     Document newDocument = (Document) getSession(serverUrl, username, password).getObject(documentID); 
     System.out.println(newDocument.getId()); 
     try { 
     ContentStream cs = newDocument.getContentStream(null); 
      BufferedInputStream in =new BufferedInputStream(cs.getStream()); 
        FileOutputStream fos = new FileOutputStream(fullPath); 
        OutputStream bufferedOutputStream = new BufferedOutputStream(fos); 
        byte[] buf = new byte[1024]; 
        int n=0; 
        while ((n=in.read(buf))>0) 
        { 
         bufferedOutputStream.write(buf,0,n); 
        } 
     bufferedOutputStream.close(); 
        fos.close(); 
        in.close(); 
     } 
     catch (IOException e) 
     { 
     throw new RuntimeException(e.getLocalizedMessage()); 
     } 
    } 

方式二:使用文件路徑

在這個解決方案,你必須得到文檔的路徑,有時很難得到它,這就是方式,我總是第一個

public static void downloadDocumentByPath(String serverUrl, String username, String password ,String path,String destinationFolder){ 
     String fileExtention = path.substring(path.lastIndexOf(".")+1,path.length()); 
     String folderPath=path.substring(0,path.lastIndexOf("/")); 
     String fileName=path.substring(path.lastIndexOf("/")+1,path.length()); 
     Folder parentFolder = getFolderByPath(serverUrl, username, password,folderPath); 
     Document newDocument = getChild(serverUrl, username, password , parentFolder ,fileName); 
     String fullPath = destinationFolder+fileName; 

    try { 
     ContentStream cs = newDocument.getContentStream(null); 
      BufferedInputStream in =new BufferedInputStream(cs.getStream()); 
        FileOutputStream fos = new FileOutputStream(destinationFolder); 
        System.out.println("****-**"+destinationFolder+":::"); 
        OutputStream bufferedOutputStream = new BufferedOutputStream(fos); 
        byte[] buf = new byte[1024]; 
        int n=0; 
        while ((n=in.read(buf))>0) 
        { 
         bufferedOutputStream.write(buf,0,n); 
        } 
     bufferedOutputStream.close(); 
        fos.close(); 
        in.close(); 
     } 
     catch (IOException e) 
     { 
     throw new RuntimeException(e.getLocalizedMessage()); 
     } 
    } 
工作

你可以在這裏閱讀更多Download user selected file/upload a file to a user selected directory both with primefaces

此外,您可以用contentStram工作,它看起來像這樣

public InputStream downloadDocument(String serverURL, String nomUtilisateur, String passwordUtilisateur, String path, String nomFile) { 

Document newDocument = (Document) getSession(serverURL, nomUtilisateur, passwordUtilisateur).getObject(path); 
    ContentStream cs = newDocument.getContentStream(null); 


    return cs.getStream(); 
} 

,只需調用此方法

public void downloaddoc(Document doc) throws FileNotFoundException, TransformerConfigurationException, TransformerException { 

InputStream input = downloaddoc(serverUrl, username, password, doc.getPath(), doc.getNameFile); 

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
    setDownload(new DefaultStreamedContent(input, externalContext.getMimeType(doc.getNomRepertoire()), doc.getNomRepertoire())); 

} 

希望有所幫助你。

+0

我已經在我的這個問題中嘗試過你的代碼,但它沒有獲取ContentStream中的文檔內容cs = newDocument.getContentStream(null); 。我在我現在的帖子中提出這個問題。我沒有收到任何文件。 – nagi

+0

我正在獲取文檔doc1 =(Document)session.getObject(doc.getId()); OR Document newDocument =(Document)session.getObjectByPath(path1);從露天,但是當我得到ContentStream使用ContentStream cs = newDocument.getContentStream(null);我什麼都沒有或換句話說數據長度爲空。或者還有其他問題,我沒有得到我的文檔下載? – nagi

+0

你看到我的編輯了嗎? –