Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
BedrockMission!

Learn More

View all

Sign in to view all badges

AEM Cloud Service - Create Asset Servlet for Uploading Small files using CURL or from Third Party Apps | AEM Community Blog Seeding

Avatar

Avatar
Establish
Community Manager
kautuk_sahni
Community Manager

Likes

1,123 likes

Total Posts

6,108 posts

Correct Reply

1,144 solutions
Top badges earned
Establish
Coach
Originator
Contributor 2
Contributor
View profile

Avatar
Establish
Community Manager
kautuk_sahni
Community Manager

Likes

1,123 likes

Total Posts

6,108 posts

Correct Reply

1,144 solutions
Top badges earned
Establish
Coach
Originator
Contributor 2
Contributor
View profile
kautuk_sahni
Community Manager

18-04-2021

BlogImage.jpg

AEM Cloud Service - Create Asset Servlet for Uploading Small files using CURL or from Third Party Ap... by Sreekanth Choudry Nalabotu

Abstract

Uploading assets to AEM Cloud Service is a 3 step process (initiateUpload.json, Upload to blob storage, completeUpload.json). Tools like https://github.com/adobe/aem-upload can be used to upload files to AEM using a NodeJS client...

This post is on creating simple assets (text , json files etc.) in AEM using CURL or other third party apps in a single step (in traditional AEMs this is provided by .createasset.html check documentation). Pass the fileName and fileContent parameters to create assets in AEM with this servlet installed...

Solution
Add a servlet apps.experienceaem.assets.core.servlets.EAEMCreateAssetServlet to create the assets in AEM...

package apps.experienceaem.assets.core.servlets;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.osgi.services.HttpClientBuilderFactory;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
import org.apache.sling.api.wrappers.SlingHttpServletResponseWrapper;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONObject;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.PrintWriter;

@Component(
immediate = true,
service = Servlet.class,
property = {
"sling.servlet.selectors=eaemcreateasset",
"sling.servlet.methods=POST",
"sling.servlet.resourceTypes=sling/servlet/default"
}
)
public class EAEMCreateAssetServlet extends SlingAllMethodsServlet {
private static final Logger log = LoggerFactory.getLogger(EAEMCreateAssetServlet.class);

private static String INITIATE_UPLOAD_REQ = ".initiateUpload.json";
public static String FILE_NAME = "fileName";
public static String UPLOAD_TOKEN = "uploadToken";
public static String MIME_TYPE = "mimeType";
public static String FILE_SIZE = "fileSize";

@Reference
private HttpClientBuilderFactory httpClientBuilderFactory;

private CloseableHttpClient httpClient;

protected void activate(ComponentContext ctx) {
HttpClientBuilder builder = httpClientBuilderFactory.newBuilder();

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30000)
.setSocketTimeout(30000).build();

builder.setDefaultRequestConfig(requestConfig);

httpClient = builder.build();
}

protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
String fileName = request.getParameter("fileName");
String fileContent = request.getParameter("fileContent");

try {
if (StringUtils.isEmpty(fileName)) {
response.sendError(SlingHttpServletResponse.SC_FORBIDDEN, "fileName parameter missing");
return;
}

int fileSize = fileContent.length();
request.setAttribute(FILE_NAME, fileName);
request.setAttribute(FILE_SIZE, fileSize);

String initiateUploadResponse = makeInitiateUploadRequest(request, response);

log.debug("initiateUpload Response : " + initiateUploadResponse);

JSONObject uploadResponse = new JSONObject(initiateUploadResponse);
JSONArray filesJSON = uploadResponse.getJSONArray("files");
JSONObject fileJSON = (JSONObject) filesJSON.get(0);

String binaryPOSTUrl = fileJSON.getJSONArray("uploadURIs").getString(0);

HttpPut put = new HttpPut(binaryPOSTUrl);
HttpEntity entity = new StringEntity(fileContent);

put.setEntity(entity);

HttpResponse putResponse = httpClient.execute(put);
int statusCode = putResponse.getStatusLine().getStatusCode();

if( (statusCode < 200) || (statusCode > 210)){
response.sendError(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error uploading file - " + putResponse.getStatusLine().getReasonPhrase());
return;
}

String completedResponse = makeCompleteUploadRequest(uploadResponse, request, response);

log.debug("completeUpload Response : " + completedResponse);

response.getWriter().print(fileName);
} catch (Exception e) {
log.error("Error creating file : {}", fileName);
response.sendError(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error creating file - " + e.getMessage());
}
}

private String makeCompleteUploadRequest(JSONObject uploadResponse, SlingHttpServletRequest request,
SlingHttpServletResponse response) throws Exception{
JSONArray filesJSON = uploadResponse.getJSONArray("files");
JSONObject fileJSON = (JSONObject) filesJSON.get(0);

String uploadToken = fileJSON.getString("uploadToken");
String mimeType = fileJSON.getString("mimeType");

String completeURI = uploadResponse.getString("completeURI");

request.setAttribute(UPLOAD_TOKEN, uploadToken);
request.setAttribute(MIME_TYPE, mimeType);

SlingHttpServletRequest wrapperRequest = new FileNameSlingServletRequestWrapper(request);
SlingHttpServletResponse wrapperResponse = new EAEMSlingModelResponseWrapper(response);

RequestDispatcher dp = wrapperRequest.getRequestDispatcher(completeURI);

dp.include(wrapperRequest, wrapperResponse);

return wrapperResponse.toString();
}

private String makeInitiateUploadRequest(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws Exception{
String folderPath = request.getResource().getPath();

SlingHttpServletRequest wrapperRequest = new FileNameSlingServletRequestWrapper(request);
RequestDispatcher dp = wrapperRequest.getRequestDispatcher(folderPath + INITIATE_UPLOAD_REQ);

SlingHttpServletResponse wrapperResponse = new EAEMSlingModelResponseWrapper(response);

dp.include(wrapperRequest, wrapperResponse);

String uploadResponseStr = wrapperResponse.toString();

if(StringUtils.isEmpty(uploadResponseStr)){
response.sendError(SlingHttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Empty upload response, file creation failed");
return "";
}

//uploadResponseStr = getTestInitiateUploadResponse();

return uploadResponseStr;
}


private class EAEMSlingModelResponseWrapper extends SlingHttpServletResponseWrapper {
private CharArrayWriter writer;

public EAEMSlingModelResponseWrapper (final SlingHttpServletResponse response) {
super(response);
writer = new CharArrayWriter();
}

public PrintWriter getWriter() throws IOException {
return new PrintWriter(writer);
}

public String toString() {
return writer.toString();
}
}

private class FileNameSlingServletRequestWrapper extends SlingHttpServletRequestWrapper {
public FileNameSlingServletRequestWrapper(final SlingHttpServletRequest request) {
super(request);
}

public String[] getParameterValues(String paramName) {
if(EAEMCreateAssetServlet.FILE_NAME.equals(paramName)){
return new String[] { String.valueOf(super.getAttribute(FILE_NAME)) };
}else if(EAEMCreateAssetServlet.FILE_SIZE.equals(paramName)){
return new String[] { String.valueOf(super.getAttribute(FILE_SIZE)) };
}else if(EAEMCreateAssetServlet.UPLOAD_TOKEN.equals(paramName)){
return new String[] { (String)super.getAttribute(UPLOAD_TOKEN) };
}else if(EAEMCreateAssetServlet.MIME_TYPE.equals(paramName)){
return new String[] { (String)super.getAttribute(MIME_TYPE) };
}

return super.getParameterValues(paramName);
}
}
}


To make a CURL request using login-token

Read Full Blog

AEM Cloud Service - Create Asset Servlet for Uploading Small files using CURL or from Third Party Ap...

Q&A

Please use this thread to ask the related questions.

AEM AEMEBlogSeeding Experience Manager