问题
I work with alfresco Community 4.0 and I used this jar alfresco-web-service-client-4.0.d.jar
using this code I can save my test.pdf file in alfresco :
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;
}
after saving this file in alfresco I have this id d7633eff-8595-4d6c-8c18-a29a656607ba
it will be used later to download this file
This is the download code :
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;
}
currently I change the test.pdf file content without changing the file name and I put it in another location in the disc.
This is the new file location.
C:/version/test.pdf
So in the disk I have two files with the same name but with different content.
my goal is to save the new file in alfresco but using versioning.
in my opinion I must use the old id which is saving in alfresco : d7633eff-8595-4d6c-8c18-a29a656607ba
so I should develop a method that takes as a parameter the new file and the old id
like this
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 {
.............
.............
in my opinion this method must save the new file in alfresco like this test_2.pdf or test_v2.pdf ..
so the two files are saved in alfresco and having the same id
and in the download method I want to have the latest version.
so I must change the method getContentById ("d7633eff-8595-4d6c-8c18-a29a656607ba", "admin", "admin");
in order to return the latest version which is test_2.pdf or test_v2.pdf ...
I tried unsuccessfully to work with OpenCMIS using alfresco-OpenCMIS-extension-0.7.jar
I added this lines in Alfresco\tomcat\webapps\alfresco\WEB-INF\classes\alfresco\model\contentModel.xml
<mandatory-aspects>
<aspect>cm:versionable</aspect>
</mandatory-aspects>
also I added this line version.store.enableAutoVersioning=true
in Alfresco\tomcat\shared\classes\alfresco-global.properties
is there anyone who can help me to solve my problem
UPDATED :
I work with CMIS :
I try with this code :
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();
}
I call this fonction using this code :
File file = new File("C:/version/test.pdf");
saveVersioning(file, "test.pdf","admin","admin","d7633eff-8595-4d6c-8c18-a29a656607ba");
I used this jar :
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
but when I try to test I have this error :
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
回答1:
The fastest and easiest way to achieve that is to leverage the RESTfull API
This will also ensure compatibility with new versions of alfresco.
Note that you need to provide the noderef for the document to update in the form property updatenoderef and that the property majorversion is a boolean flag to specify if the new version is a minor/major version of the document.
Here is a sample code that might help you with your usecase:
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 );
}
Note 1: You need to replace these tockens <*> with your own values/vars
Note 2: If you have problem retrieving a ticket, check this link, or this one
回答2:
If you enable the versioning as you already did, you need only to update the document with the new binary and the new name. Alfresco will take care of the versioning. The get method will retrieve the last version.
This link describes how to update a document using CMIS
I do not think that you need to modify the get method.
来源:https://stackoverflow.com/questions/34575960/saving-file-in-alfresco-with-version-and-download-the-latest-version