How to add a document to the Alfresco Repository with Java code?

ⅰ亾dé卋堺 提交于 2019-12-04 19:45:48
@Autowired
NodeService nodeService

Will not work in alfresco

You need to inject it with proper setter method. Your bean should be like below.

<bean id="somerandombeanname" class="management.FileManager" >
    <property name="moduleId" value="${project.artifactId}" />
    <property name="serviceRegistry" ref="ServiceRegistry" />
    <property name="nodeService" ref="NodeService" />
    <property name="transactionService" ref="TransactionService" />
    <property name="contentService" ref="ContentService" />
</bean>

Your java class should contain following for injecting nodeService.

private NodeService nodeService;

public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
}

Luckily I have code for file upload thorugh JAVA backed webscript. Hope this help you too.To create java backed webscript see this

Create one class named CustomFileUpload.java and put following content

package com.upload;

import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
import org.apache.commons.io.IOUtils;
import org.json.JSONException;
import org.json.JSONObject;

public class CustomFileUpload extends DeclarativeWebScript {

    private final String UPLOAD_FILE_PATH = "C:\\Users\\Test\\Desktop\\test.txt";
    private int statusCode;

    protected Map<String, Object> executeImpl(WebScriptRequest arg0, Status status, Cache cache) {
        Map<String, Object> model = new HashMap<String, Object>();
        try {
            String URL = "http://localhost:8080/alfresco/service/upload/fileupload?alf_ticket=" +getAlfticket();
            File file = new File(UPLOAD_FILE_PATH);
            String filetype = "text/plain";
            String filename = file.getName();
            HttpClient client = new HttpClient();
            PostMethod post = new PostMethod(URL);

            Part[] parts = {

                    new FilePart("filedata", filename, file, filetype, null),
                    new StringPart("filename", filename),
                    new StringPart("description", "This is test description"),
                    new StringPart("destination", "workspace://SpacesStore/bb424b1d-0418-4954-8591-b8c807264df0")
            };

            post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
            statusCode = client.executeMethod(post);
            System.out.println(post.getResponseBodyAsString());
            post.releaseConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (statusCode == 200) {
            model.put("result", "File uploaded successfully.");
            return model;
        } else {
            model.put("result", "There was an error while uploading document.");
            return model;
        }
    }

    private static String getAlfticket() throws IOException, JSONException {
        URL url = new URL("http://localhost:8080/alfresco/service/api/login?u=admin&pw=admin&format=json");
        URLConnection con = url.openConnection();
        InputStream in = con.getInputStream();
        String encoding = con.getContentEncoding();
        encoding = encoding == null ? "UTF-8" : encoding;
        String json = IOUtils.toString(in, encoding);
        JSONObject getData = new JSONObject(json);

        return getData.getJSONObject("data").get("ticket").toString();
    }
}

NOTE: In destination you can put nodeRef of folder in which you want to upload.

Than create bean in context file name it whatever you want say mycustom-context.xml and put it in ALFRESCO_HOME\tomcat\shared\classes\alfresco\extension and content

<bean id="webscript.com.upload.customupload.post" class="com.upload.CustomFileUpload" parent="webscript">
</bean>

Finally register this web script in alfresco by creating customupload.post.desc.xml. and put

<webscript>
   <shortname>File Upload</shortname>
   <description>Upload files to user home</description>
   <url>/upload/fileupload?alf_ticket={ticket}</url>
   <format default="json"/>
   <authentication>user</authentication>
</webscript>

And last create view as we have declared JSON is default format so we need to create customupload.post.json.ftl

${result}

And put these both files in ALFRESCO_HOME\tomcat\shared\classes\alfresco\extension\templates\webscripts\com\upload

Now restart server and hit http://localhost:8080/alfresco/service/upload/fileupload and you will see file uploaded in folder(Whatever you have given). For Reference

Finally! This is the solution for adding a file to the Repository:

CustomFileUpload.java:

package org.example;

import org.springframework.extensions.webscripts.Cache;
import org.springframework.extensions.webscripts.DeclarativeWebScript;
import org.springframework.extensions.webscripts.Status;
import org.springframework.extensions.webscripts.WebScriptRequest;

import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import org.alfresco.error.AlfrescoRuntimeException;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.io.FileUtils;

public class CustomFileUpload extends DeclarativeWebScript {
    private final String UPLOAD_FILE_PATH = "{someRandomFile}";
    private final String UPLOAD_DESTINATION = "workspace://SpacesStore/{someRandomNodeRef}";
    protected ServiceRegistry serviceRegistry;

    public ServiceRegistry getServiceRegistry() {
        return serviceRegistry;
    }

    public void setServiceRegistry(ServiceRegistry serviceRegistry) {
        this.serviceRegistry = serviceRegistry;
    }

    protected Map<String, Object> executeImpl(WebScriptRequest req, Status status, Cache cache) {
        File file = new File(UPLOAD_FILE_PATH);
//      NodeRef parent = getCompanyHome();
        NodeRef parent = new NodeRef(UPLOAD_DESTINATION);
        String name = "name of file in Repository " + System.currentTimeMillis();

        Map<QName, Serializable> props = new HashMap<QName, Serializable>(1);
        props.put(ContentModel.PROP_NAME, name);

        // use the node service to create a new node
        NodeRef node = serviceRegistry.getNodeService().createNode(
                        parent,
                        ContentModel.ASSOC_CONTAINS,
                        QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, name),
                        ContentModel.TYPE_CONTENT, props).getChildRef();

        // Use the content service to set the content onto the newly created
        // node
        ContentWriter writer = serviceRegistry.getContentService().getWriter(node, ContentModel.PROP_CONTENT, true);
        writer.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
        writer.setEncoding("UTF-8");
        String text = "";
        try {
            text = FileUtils.readFileToString(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        writer.putContent(text);

        Map<String, Object> model = new HashMap<String, Object>();
        if (status.getCode() == Status.STATUS_OK) {
            model.put("resultRepoWS", "File \"" + file.getName() + "\" uploaded successfully to the repository. Status: " + status.getCode());
            return model;
        } else {
            model.put("resultRepoWS", "There was an error while uploading document \"" + file.getName() + "\" - Status: " + status.getCode());
            return model;
        }
    }

    //If you want to test with CompanyHome first use this method instead of the NodeRef
    @SuppressWarnings("unused")
    private NodeRef getCompanyHome() {
        StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore");
        serviceRegistry.getSearchService();
        ResultSet rs = serviceRegistry.getSearchService().query(storeRef, SearchService.LANGUAGE_XPATH, "/app:company_home");
        NodeRef parent = null;
        try {
            if (rs.length() == 0) {
                throw new AlfrescoRuntimeException("Didn't find Company Home");
            }
            parent = rs.getNodeRef(0);
        } finally {
            rs.close();
        }
        return parent;
    }
}

This java class is placed in the following folder:

{tomcat}\webapps\alfresco\WEB-INF\classes\org\example

Where org\example is the same as the package org.example. Now we have a class, now we need the configuration files as I call them:

  • customfileupload-context.xml

Which is located here

  • {tomcat}\shared\classes\alfresco\extension

You will also need these:

  • customfileupload.post.desc.xml
  • customfileupload.post.json.ftl

Which are located here

  • {tomcat}\shared\classes\alfresco\extension\webscripts\org\example

Noticed the folder? It's the same like the package mentioned earlier.

Contents of customfileupload-context.xml:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN 2.0//EN'
  'http://www.springframework.org/dtd/spring-beans-2.0.dtd'>
<beans>
    <bean id="webscript.org.example.customfileupload.post" class="org.example.CustomFileUpload" parent="webscript">
        <property name="ServiceRegistry" ref="ServiceRegistry" />
    </bean>
</beans>

Contents of customfileupload.post.desc.xml:

<webscript>
   <shortname>File Upload</shortname>
   <description>Upload files to user home</description>
   <url>/upload/fileupload.json</url>
   <format default="json"/>
   <authentication runas="admin">guest</authentication>
   <transaction>required</transaction>
</webscript>

Contents of customfileupload.post.json.ftl:

<#escape x as jsonUtils.encodeJSONString(x)>  {  "resultRepoWS": "${resultRepoWS}"  }  </#escape>

This is it. With this you'll be able to upload a file to the Repository of Alfresco with Alfresco 5.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!