AEM File Upload | Community
Skip to main content
darshanb7870202
New Participant
October 26, 2017
Solved

AEM File Upload

  • October 26, 2017
  • 6 replies
  • 5907 views

I have deployed osgi bundle to AEM 6.2 and calling sling servlet from java class as post request. But request is not passed to sling servlet.

Example : Adobe Experience Manager Help | Automating the process of uploading multiple digital assets to the Adobe Experience Mana…

Need help how can I call post method of sling servlet from java class.

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by smacdonald2008

I just tested this with AEM 6.2 - App:

Successfully posted these file to the DAM via a Servlet that uses the Asset-manager API:

6 replies

darshanb7870202
New Participant
October 30, 2017

Hi,

This has been already implemented in sling servlet but it is still not working for me.

I have configured log file in AEM but no log has been captured in that. Can you let me know how can I get the logs of sling servlet deployed in AEM ?

Thanks,

Darshan

smacdonald2008
New Participant
October 27, 2017

WHen writing Sling Servlets to handle files - you need to use this app Java logic:

@Override

protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServerException, IOException {

        

      try

         {

         final boolean isMultipart = org.apache.commons.fileupload.servlet.ServletFileUpload.isMultipartContent(request);

         PrintWriter out = null;

         int index = 1 ;

          

           out = response.getWriter();

           if (isMultipart) {

             final java.util.Map<String, org.apache.sling.api.request.RequestParameter[]> params = request.getRequestParameterMap();

             

             for (final java.util.Map.Entry<String, org.apache.sling.api.request.RequestParameter[]> pairs : params.entrySet()) {

               

                 final String k = pairs.getKey();

               

                 final org.apache.sling.api.request.RequestParameter[] pArr = pairs.getValue();

               

                 final org.apache.sling.api.request.RequestParameter param0 = pArr[0];

                 

                 //Determine if the posted value is a file or the JCR Path

                 boolean formField = param0.isFormField(); //Is this a form field or a posted file

                 

                 if (formField)

                 {

                     String libLoc = param0.getString(); 

                     clientLibPath = libLoc ; //Set the class member - its the first posted value from the client

                     log.info("FIELD VALUE IS: "+libLoc )  ;

                     

                 }

                 else

                 {

                     // final org.apache.sling.api.request.RequestParameter param1 = pArr[1];

                  final InputStream stream = param0.getInputStream();

                  String mimeType = param0.getContentType();

               

                  log.info("THE CONTENT TYPE IS: "+mimeType )  ;

                  

                  //Save the uploaded file into the Adobe CQ DAM

                  writeToClientLib(stream,param0.getFileName(),clientLibPath,mimeType  );

                 }

                 index ++;

             }

           }

         }

          

         catch (Exception e) {

             e.printStackTrace();

         }

      

     }

darshanb7870202
New Participant
October 27, 2017

Hi,

Please find my code below,

Local ::

// Posts the selected file to AEM
private static void postAEM(File file, String host, String path, String mimeType) {
  try {

   String aemPostUrl = host + "/bin/upmanydamfiles";
   System.out.println("AEM HOST :: "+ aemPostUrl);
   HttpPost post = new HttpPost(aemPostUrl);
  

   org.apache.http.entity.mime.MultipartEntity entity = new org.apache.http.entity.mime.MultipartEntity();
   byte[] b = new byte[(int) file.length()];
   org.apache.http.entity.mime.content.FileBody fileBody = new org.apache.http.entity.mime.content.FileBody(file, mimeType);
   org.apache.http.entity.mime.content.StringBody filePath = new org.apache.http.entity.mime.content.StringBody(path);

   entity.addPart("filePath", filePath);
   entity.addPart("fileBody", fileBody);
   post.setEntity(entity);

   org.apache.http.impl.client.DefaultHttpClient client = new org.apache.http.impl.client.DefaultHttpClient();
   org.apache.http.HttpResponse response = null;
   System.out.println("Calling sling servlet from postAEM()..................");
   response = client.execute(post);

   System.out.println("Done");
  } catch (Exception e) {
   e.printStackTrace();
  }

}

Console output :: AEM HOST :: http://dev1.company.com/bin/upmanydamfiles
Calling sling servlet from postAEM()..................
Done

Sling servlet deployed on AEM ::

@SlingServlet(paths="/bin/upmanydamfiles", methods = "POST", metatype=true)
public class HandleFile extends SlingAllMethodsServlet {
private static final long serialVersionUID = 2598426539166789515L;
private Session session;
private String clientLibPath = "";

protected final Logger log = LoggerFactory.getLogger(getClass());

private ResourceResolverFactory resolverFactory;

public HandleFile() {
}

protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
   throws ServerException, IOException {
}

protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response)
   throws ServerException, IOException {
  try {
   log.info("Inside doPost method of HandleFile...");
   // boolean isMultipart =
   // ServletFileUpload.isMultipartContent(request);
   PrintWriter out = null;
   int index = 1;

   out = response.getWriter();
   // if (isMultipart) {
   Map<String, RequestParameter[]> params = request.getRequestParameterMap();
   log.info("Params fetched from request......");
   for (Map.Entry<String, RequestParameter[]> pairs : params.entrySet()) {
    String k = (String) pairs.getKey();

    RequestParameter[] pArr = (RequestParameter[]) pairs.getValue();

    RequestParameter param0 = pArr[0];

    boolean formField = param0.isFormField();

    if (formField) {
     String libLoc = param0.getString();
     clientLibPath = libLoc;
    } else {
     InputStream stream = param0.getInputStream();
     String mimeType = param0.getContentType();
     log.info("THE CONTENT TYPE IS: " + mimeType);
     log.info("Writting content to location :" + clientLibPath);
     writeToClientLib(stream, param0.getFileName(), clientLibPath, mimeType);
     log.info("Asset created at location:: " + clientLibPath);
    }
    index++;
   }
   // }
  } catch (Exception e) {
   int index;
   e.printStackTrace();
  }
}

private String writeToClientLib(InputStream is, String fileName, String path, String mimetype) {
  try {
   log.info("Inside writeToClientLib method of HandleFile......");

   ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);
   AssetManager assetMgr = (AssetManager) resourceResolver.adaptTo(AssetManager.class);
   String newFile = path + fileName;
   log.info("Creating asset in AEM......");
   assetMgr.createAsset(newFile, is, mimetype, true);
   return newFile;
  } catch (Exception e) {
   e.printStackTrace();
  }
  return null;
}

protected void bindResolverFactory(ResourceResolverFactory paramResourceResolverFactory) {
  resolverFactory = paramResourceResolverFactory;
}

protected void unbindResolverFactory(ResourceResolverFactory paramResourceResolverFactory) {
  if (resolverFactory == paramResourceResolverFactory) {
   resolverFactory = null;
  }
}

When I check in AEM content location, I am not able to find the file. I have also configured logger for bundle that is deployed on AEM but nothing found in logger.

Please guide for the same.

smacdonald2008
smacdonald2008Accepted solution
New Participant
October 26, 2017

I just tested this with AEM 6.2 - App:

Successfully posted these file to the DAM via a Servlet that uses the Asset-manager API:

smacdonald2008
New Participant
October 26, 2017

Set a breakpoint in the Java code and let us know what is happening. You may have the wrong URL or something like that. But i suggest watching the video and see it working.

smacdonald2008
New Participant
October 26, 2017

that article shows you how to post from a Java client using Java logic to an AEM Sling Servlet that uses the AssetManager API:

//Read the File from the File System

  File myFile = new File(fileLocation+fileName);

              

               org.apache.http.entity.mime.MultipartEntity entity = new org.apache.http.entity.mime.MultipartEntity ();

               byte[] b = new byte[(int)myFile.length()];

               org.apache.http.entity.mime.content.FileBody fileBody = new org.apache.http.entity.mime.content.FileBody(myFile, mimeType) ;

               org.apache.http.entity.mime.content.StringBody imageTitle = new org.apache.http.entity.mime.content.StringBody(path);

               entity.addPart("imageTitle", imageTitle);

               entity.addPart("image", fileBody);

               post.setEntity(entity);

  

               org.apache.http.impl.client.DefaultHttpClient client = new org.apache.http.impl.client.DefaultHttpClient();

               org.apache.http.HttpResponse response = null;

               response = client.execute(post);

See this blog - you can watch video too and see it working:

Scott's Digital Community: Automating the process of uploading multiple digital assets to the Adobe Experience Manager D…