javaalfrescoopencmisapache-chemistry

Download Document from alfresco using opencmis


I want to download document from alfresco using path but i am getting content length null and image can be downloaded in browser but nothing is displaying. Can anybody point out what i am doing wrong.

    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());
       }
        }
    }

    }

OUTPUT which i got in console:

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: java.io.BufferedInputStream@173b5e2

Image in alfresco :

enter image description here

Image i have downloaded is :

enter image description here


Solution

  • In alfresco you can download a document using to ways

    In my solution you will use

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

    First way : using the document Id

    The ID of a document is the the ID that Alfresco fixed for this document when we upload it in Alfresco

    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());
           }
         }
    

    Second way : using the document Path

    In this solution you have to get the Path of the Document, sometimes it's hard to get it, this is way i always work with the first

    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());
           }
         }
    

    You can Read more here Download user selected file/upload a file to a user selected directory both with primefaces

    In addition you can work with contentStram it will look like this

    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();
    }
    

    and simply call this method

    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()));
    
    }
    

    Hope that helped you.