英文:
Alfresco - How to add/set content of the file while doing post using RestTemplate
问题
我正尝试使用以下方法将文件上传到DocLibrary文件夹:
private static void postTheDocument() {
final String restENDPoint = "http://servername:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/48eea6b2-fe9b-4cd2-8270-5caa35d7e8dc/children";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setBasicAuth("admin", "admin");
String requestJson = "{\"name\": \"TestName123s.doc\",\"nodeType\": \"hr:HR_Type\",\"properties\":{\"cm:title\":\"New Test title123\",\"hr:emp_no\":\"123456\",\"hr:lname\":\"Last_Name1\",\"hr:fname\":\"First_Name1\"}}";
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
HttpEntity<String> response = restTemplate.exchange(restENDPoint, HttpMethod.POST, entity, String.class);
System.out.println(response.getBody().toString());
}
文档建议使用以下curl命令:
curl -utest:test -X POST host:port/alfresco/api/-default-/public/alfresco/versions/1/nodes/12341234-2344-2344-43243242334/children -F filedata=@test.txt
使用postTheDocument()方法创建了空白文档。但当我尝试以下请求时:
String requestJson = "{\"filedata\": \"@Z:/05test/YYYYest11qq890.pdf\",\"name\": \"TestName123s.doc\",\"nodeType\": \"hr:HR_Type\",\"properties\":{\"cm:title\":\"New Test title123\",\"hr:emp_no\":\"123456\",\"hr:lname\":\"Last_Name1\",\"hr:fname\":\"First_Name1\"}}";
我收到以下异常:
Exception in thread "main" org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [{"error":{"errorKey":"Could not read content from HTTP request body: Unrecognized field \"filedata\" (class org.alfresco.rest.api.model.Node), not marked as ignorable (36 known properties: "modifiedB... (1969 bytes)]
我在这里做错了什么或者漏掉了什么?
英文:
I am trying to upload a file to the DocLibrary folder using the below method:
private static void postTheDocument() {
final String restENDPoint = "http://servername:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/48eea6b2-fe9b-4cd2-8270-5caa35d7e8dc/children";
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setBasicAuth("admin", "admin");
String requestJson = "{\"name\": \"TestName123s.doc\",\"nodeType\": \"hr:HR_Type\",\"properties\":{\"cm:title\":\"New Test title123\",\"hr:emp_no\":\"123456\",\"hr:lname\":\"Last_Name1\",\"hr:fname\":\"First_Name1\"}}";
HttpEntity<String> entity = new HttpEntity<String>(requestJson, headers);
HttpEntity<String> response = restTemplate.exchange(restENDPoint, HttpMethod.POST, entity,
String.class);
System.out.println(response.getBody().toString());
}
The documentation suggest this:
curl -utest:test -X POST host:port/alfresco/api/-default-/public/alfresco/versions/1/nodes/12341234-2344-2344-43243242334/children -F filedata=@test.txt
Using the method postTheDocument() creates the empty document. But when I try below request:
String requestJson = "{\"filedata\": \"@Z:/05test/YYYYest11qq890.pdf\",\"name\": \"TestName123s.doc\",\"nodeType\": \"hr:HR_Type\",\"properties\":{\"cm:title\":\"New Test title123\",\"hr:emp_no\":\"123456\",\"hr:lname\":\"Last_Name1\",\"hr:fname\":\"First_Name1\"}}";
I get the following Exception:
Exception in thread "main" org.springframework.web.client.HttpClientErrorException$BadRequest: 400 : [{"error":{"errorKey":"Could not read content from HTTP request body: Unrecognized field \"filedata\" (class org.alfresco.rest.api.model.Node), not marked as ignorable (36 known properties: \"modifiedB... (1969 bytes)]
What I am doing wrong here or what I am missing?
答案1
得分: 1
我相信常见的方法是在Alfresco中创建节点,然后通过多部分上传将文件发送到节点,URL为"http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children"(有关多部分上传的示例,请参见:https://www.baeldung.com/httpclient-multipart-upload)。
要从创建的节点获取节点ID:
if (response != null) {
try {
JSONObject result;
result = new JSONObject(response.getBody());
System.out.println(result.toString());
JSONObject oj = result.getJSONObject("entry");
String id = (String) oj.get("id");
System.out.println(id);
fileupload(file_upload,id);
} catch (JSONException e2) {
e2.printStackTrace();
}
}
英文:
I believe the common approach is to create the node in Alfresco, then send the file to the node in a multipart upload to "http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/-root-/children" (for an example of multipart upload see: https://www.baeldung.com/httpclient-multipart-upload).
To get the node id from the created node:
if (response != null) {
try {
JSONObject result;
result = new JSONObject(response.getBody());
System.out.println(result.toString());
JSONObject oj = result.getJSONObject("entry");
String id = (String) oj.get("id");
System.out.println(id);
fileupload(file_upload,id);
} catch (JSONException e2) {
e2.printStackTrace();
}
}
答案2
得分: 1
发布适用于我的解决方案。虽然它不是基于RestTemplate的,但它有效。这是我从Alfresco支持团队那里获得的解决方案,它非常有效(请参阅内联注释):
private static void postFileAndMetadataToAlfresco() throws IOException, AuthenticationException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://someservername:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/12341234-1234-1234-1234-123412341234/children");
UsernamePasswordCredentials creds = new UsernamePasswordCredentials ("admin","adminpswd");
httpPost.addHeader (new BasicScheme().authenticate(creds,httpPost, null));
File payload = new File ("/path/to/my/file.pdf");
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); // 实体构建器
builder.addPart("filedata", new FileBody(payload)); // 这是我遇到问题的地方
builder.addTextBody ("name", "thenamegoeshere");
builder.addTextBody ("foo", "foo");
builder.addTextBody ("bar", "bar");
builder.addTextBody ("description", "descriptiongoeshere");
builder.addTextBody ("overwrite", "true");
HttpEntity entity = builder.build();
httpPost.setHeader("Accept","application/json");
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost); // 发送请求并获取响应
System.out.println(response.toString()); // 将响应打印到控制台
httpClient.close(); // 关闭客户端
}
英文:
Posting the solution that worked for me. Its not RestTemplate based but it works. This is the solution I got from Alfresco Support folks and it works perfectly well (refer the inline comments):
private static void postFileAndMetadataToAlfresco() throws IOException, AuthenticationException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost("http://someservername:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/12341234-1234-1234-1234-123412341234/children");
UsernamePasswordCredentials creds = new UsernamePasswordCredentials ("admin","adminpswd");
httpPost.addHeader (new BasicScheme().authenticate(creds,httpPost, null));
File payload = new File ("/path/to/my/file.pdf");
MultipartEntityBuilder builder = MultipartEntityBuilder.create(); // Entity builder
builder.addPart("filedata", new FileBody(payload)); // this is where I was struggling
builder.addTextBody ("name", "thenamegoeshere");
builder.addTextBody ("foo", "foo");
builder.addTextBody ("bar", "bar");
builder.addTextBody ("description", "descriptiongoeshere");
builder.addTextBody ("overwrite", "true");
HttpEntity entity = builder.build();
httpPost.setHeader("Accept","application/json");
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost); // Post the request and get response
System.out.println(response.toString()); // Response print to console
httpClient.close(); // close the client
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论