Сохранение файла на свежем воздухе с версией и скачать последнюю версию

Я работаю с Alfresco Community 4.0, и я использовал этот jar alfresco-web-service-client-4.0.d.jar

используя этот код, я могу сохранить свой файл test.pdf на свежем воздухе:

File file = new File("C:/test.pdf");

  saveAttachement(file,"test.pdf", "/app:company_home/cm:MyFolder",
                        "admin", "admin")



                         public String saveAttachement(File file, String name, String folderName, String userName, String pwd)
        throws Exception {


        byte[] contentByte = IOUtils.toByteArray(new FileInputStream(file));

        // Start the session
        AuthenticationUtils.startSession(userName, pwd);

        try {
            // Create a reference to the parent where we want to create content
            Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
            ParentReference companyHomeParent = new ParentReference(storeRef, null, folderName, Constants.ASSOC_CONTAINS, null);

            // Assign name
            companyHomeParent.setChildName("cm:" + name);

            // Construct CML statement to create content node
            // Note: Assign "1" as a local id, so we can refer to it in subsequent
            //       CML statements within the same CML block
            NamedValue[] contentProps = new NamedValue[1];
            contentProps[0] = Utils.createNamedValue(Constants.PROP_NAME, name);

            CMLCreate create = new CMLCreate("1", companyHomeParent, null, null, null, Constants.TYPE_CONTENT, contentProps);

            // Construct CML statement to add titled aspect
            NamedValue[] titledProps = new NamedValue[2];
            titledProps[0] = Utils.createNamedValue(Constants.PROP_TITLE, name);
            titledProps[1] = Utils.createNamedValue(Constants.PROP_DESCRIPTION, name);

            CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_TITLED, titledProps, null, "1");

            // Construct CML Block
            CML cml = new CML();
            cml.setCreate(new CMLCreate[] { create });
            cml.setAddAspect(new CMLAddAspect[] { addAspect });

            // Issue CML statement via Repository Web Service and retrieve result
            // Note: Batching of multiple statements into a single web call
            UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);
            Reference content = result[0].getDestination();

            // Write some content
            ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();

            //String text = "The quick brown fox jumps over the lazy dog";
            ContentFormat contentFormat = new ContentFormat("text/plain", "UTF-8");
            Content contentRef = contentService.write(content, Constants.PROP_CONTENT, contentByte, contentFormat);
            System.out.println("Document are created successfully. UID:= " + content.getUuid());

            return content.getUuid();
        } catch (Throwable e) {
            System.out.println(e.toString());
        } finally {
            // End the session
            AuthenticationUtils.endSession();

            //System.exit(0);
        }

        return null;
    }

после сохранения этого файла на свежем воздухе у меня есть этот идентификатор d7633eff-8595-4d6c-8c18-a29a656607ba

он будет использован позже для загрузки этого файла

Это код загрузки:

ContentResult contentResult = getContentsById("d7633eff-8595-4d6c-8c18-a29a656607ba", "admin", "admin");


       public ContentResult getContentsById(String contentId, String userName, String pwd)
        throws Exception {
        ContentResult contentResult = new ContentResult();

        // Start the session
        AuthenticationUtils.startSession(userName, pwd);

        try {
            Store storeRef = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
            ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();

            Reference contentReference = new Reference(storeRef, contentId, null);
            Content[] readResult = null;

            try {
                readResult = contentService.read(new Predicate(new Reference[] { contentReference }, storeRef, null), Constants.PROP_CONTENT);
            } catch (ContentFault e) {
                e.printStackTrace();
            } catch (RemoteException e) {
                e.printStackTrace();
            }

            if ((readResult != null) && (readResult[0] != null)) {
                Content content = readResult[0];
                ContentFormat cnf = content.getFormat();
                Reference ref = content.getNode();

                String[] splitedUrl = content.getUrl().split("/");
                String name = splitedUrl[splitedUrl.length - 1];

                InputStream is = ContentUtils.getContentAsInputStream(content);
                byte[] contentByte = ConvertUtil.convertInputStreamToByte(is);

                contentResult.setName(name);
                contentResult.setMimetype(cnf.getMimetype());
                contentResult.setId(ref.getUuid());
                contentResult.setUrl(content.getUrl());
                contentResult.setPath(ref.getPath());
                contentResult.setContentByte(contentByte);
                System.out.println(" document has been retrieved");
            }
        } catch (Exception e) {
            System.out.println(e.toString());
        } finally {
            // End the session
            AuthenticationUtils.endSession();

            // System.exit(0);
        }

        return contentResult;
    }

в настоящее время я изменяю содержимое файла test.pdf без изменения имени файла и помещаю его в другое место на диске.

Это новое местоположение файла.

C: /version/test.pdf

Таким образом, на диске у меня есть два файла с одинаковым именем, но с разным содержанием.

Моя цель - сохранить новый файл под открытым небом, но с использованием версий.

по моему мнению, я должен использовать старый идентификатор, сохраняемый в alfresco: d7633eff-8595-4d6c-8c18-a29a656607ba

поэтому я должен разработать метод, который принимает в качестве параметра новый файл и старый идентификатор

как это

 File file = new File("C:/version/test.pdf");

  saveWithVersionAttachement(file,"d7633eff-8595-4d6c-8c18-a29a656607ba","test.pdf", "/app:company_home/cm:MyFolder",
                        "admin", "admin",)



                         public String saveWithVersionAttachement(File file,String oldId, String name, String folderName, String userName, String pwd)
        throws Exception {
 .............
 .............

по моему мнению, этот метод должен сохранить новый файл на свежем воздухе, как этот test_2.pdf или test_v2.pdf ..

так что два файла сохраняются на свежем воздухе и имеют одинаковый идентификатор

и в методе загрузки я хочу иметь последнюю версию.

поэтому я должен изменить метод getContentById ("d7633eff-8595-4d6c-8c18-a29a656607ba", "admin", "admin");

чтобы вернуть последнюю версию, которая является test_2.pdf или test_v2.pdf ...

Я безуспешно пытался работать с OpenCMIS, используя alfresco-OpenCMIS-extension-0.7.jar

Я добавил эти строки в Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\model\contentModel.xml

<mandatory-aspects>
<aspect>cm:versionable</aspect>
</mandatory-aspects>

также я добавил эту строку version.store.enableAutoVersioning=true

в Alfresco\tomcat\shared\classes\alfresco-global.properties

Есть ли кто-нибудь, кто может помочь мне решить мою проблему

ОБНОВЛЕНО:

Я работаю с CMIS:

Я пытаюсь с этим кодом:

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Repository;
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.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.commons.io.IOUtils;


     public void saveVersioning(File file, String filename, String userName, String pwd, String docId)
            throws Exception {

            SessionFactory factory = SessionFactoryImpl.newInstance();
            Map<String, String> parameters = new HashMap<String, String>();

            // User credentials.
            parameters.put(SessionParameter.USER,userName);
            parameters.put(SessionParameter.PASSWORD, pwd);

            // Connection settings.
            parameters.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
            parameters.put(SessionParameter.ATOMPUB_URL, "http://localhost:9080/alfresco/service/cmis"); // URL to your CMIS server.
            parameters.put(SessionParameter.AUTH_HTTP_BASIC, "true" );

            // Create session.
            // Alfresco only provides one repository.
            Repository repository = factory.getRepositories(parameters).get(0);

            Session session = repository.createSession();

             // Get the contents of the file
            Document doc = (Document) session.getObject(docId);
            ContentStream contentStream = doc.getContentStream(); // returns null if the document has no content
            if (contentStream != null) {


                    String mimetype = "text/plain; charset=UTF-8";
                    String content = "";

                    if (contentStream != null) {
                        filename = contentStream.getFileName();
                        mimetype = contentStream.getMimeType();
                        content = getContentAsString(contentStream);
                        System.out.println("file name "+filename);
                        System.out.println("minetype "+mimetype);
                        System.out.println("content "+content);
                    }


                    byte[] buf = IOUtils.toByteArray(new FileInputStream(file));
                    ByteArrayInputStream input = new ByteArrayInputStream(buf);

                    contentStream = session.getObjectFactory().createContentStream(
                            filename, buf.length, mimetype, input);



                    System.out.println("Document version history");
                    {
                        List<Document> versions = doc.getAllVersions();
                        for (Document version : versions) {
                            System.out.println("\tname: " + version.getName());
                            System.out.println("\tversion label: " + version.getVersionLabel());
                            System.out.println("\tversion series id: " + version.getVersionSeriesId());
                            System.out.println("\tchecked out by: "
                                    + version.getVersionSeriesCheckedOutBy());
                            System.out.println("\tchecked out id: "
                                    + version.getVersionSeriesCheckedOutId());
                            System.out.println("\tmajor version: " + version.isMajorVersion());
                            System.out.println("\tlatest version: " + version.isLatestVersion());
                            System.out.println("\tlatest major version: " + version.isLatestMajorVersion());
                            System.out.println("\tcheckin comment: " + version.getCheckinComment());
                            System.out.println("\tcontent length: " + version.getContentStreamLength()
                                    + "\n");
                        }
                    }
                }



        }



    private static String getContentAsString(ContentStream stream) throws IOException {
        StringBuilder sb = new StringBuilder();
        Reader reader = new InputStreamReader(stream.getStream(), "UTF-8");

        try {
            final char[] buffer = new char[4 * 1024];
            int b;
            while (true) {
                b = reader.read(buffer, 0, buffer.length);
                if (b > 0) {
                    sb.append(buffer, 0, b);
                } else if (b == -1) {
                    break;
                }
            }
        } finally {
            reader.close();
        }

        return sb.toString();
    }

Я называю эту функцию, используя этот код:

File file = new File("C:/version/test.pdf");

saveVersioning(file, "test.pdf","admin","admin","d7633eff-8595-4d6c-8c18-a29a656607ba");

Я использовал эту банку:

chemistry-opencmis-client-api-0.13.0.jar
chemistry-opencmis-client-bindings-0.13.0.jar
chemistry-opencmis-client-impl-0.13.0.jar
chemistry-opencmis-commons-api-0.13.0.jar
chemistry-opencmis-commons-impl-0.13.0.jar
commons-io-1.4.jar
slf4j-api-1.7.5.jar
stax2-api-3.1.4.jar
woodstox-core-asl-4.4.0.jar

но когда я пытаюсь проверить, у меня есть эта ошибка:

Caused by: java.lang.NoClassDefFoundError: org/apache/chemistry/opencmis/client/api/SessionFactory
.............
............
Caused by: java.lang.ClassNotFoundException: org.apache.chemistry.opencmis.client.api.SessionFactory
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1387)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    ... 124 more

2 ответа

Самый быстрый и простой способ добиться этого - использовать RESTfull API.

Это также обеспечит совместимость с новыми версиями Alfresco.

Обратите внимание, что вам нужно предоставить noderef для документа для обновления в свойстве формы updatenoderef и что свойство majorversion является логическим флагом, указывающим, является ли новая версия вспомогательной / основной версией документа.

Вот пример кода, который может помочь вам с вашим вариантом использования:

        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost uploadFile = new HttpPost(<alfresco-service-uri>+"/api/upload?alf_ticket="+<al-ticket>);

        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        builder.addTextBody("username", "<username>", ContentType.TEXT_PLAIN);
        builder.addTextBody("updatenoderef", <noderef>, ContentType.TEXT_PLAIN);
        builder.addTextBody("...", "...", ContentType.TEXT_PLAIN);
        builder.addBinaryBody("filedata", <InputStream>, ContentType.DEFAULT_BINARY, <filename>);
        HttpEntity multipart = builder.build();

        uploadFile.setEntity(multipart);

        CloseableHttpResponse response = httpClient.execute(uploadFile);

        String responseString = IOUtils.toString(response.getEntity().getContent(), "UTF-8"); 
        JSONObject responseJson = new JSONObject(responseString);
        if (response.getStatusLine().getStatusCode()!=200){
            throw new Exception("Couldn't upload file to the repository, webscript response :" + responseString );
        }

Примечание 1: вам нужно заменить эти токены <*> на ваши собственные значения / переменные

Примечание 2: Если у вас возникли проблемы с получением билета, проверьте эту ссылку или эту

Если вы включили управление версиями, как вы уже сделали, вам нужно только обновить документ с новым двоичным файлом и новым именем. Alfresco позаботится о версии. Метод get извлечет последнюю версию.

Эта ссылка описывает, как обновить документ с помощью CMIS

Я не думаю, что вам нужно изменить метод get.

Другие вопросы по тегам