cancel
Showing results for 
Search instead for 
Did you mean: 

Uploading using UploadContentServlet [Solved]

ale_carraro
Champ in-the-making
Champ in-the-making
I'm trying to upload a file using org.alfresco.web.app.servlet.UploadContentServlet as described in
http://wiki.alfresco.com/wiki/URL_Addressability#UploadContentServlet. The upload is a success, but the content is not the one I planned to upload:

Uploading a text file containing
Hello World
results in a file containing:

–ntFc1CtoJLgJ94PK6EIn_3Dm8HX7nXBzL
Content-Disposition: form-data; name="test.txt"
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 8bit

Hello World
–ntFc1CtoJLgJ94PK6EIn_3Dm8HX7nXBzL–

The code I'm using (with the help of Apache HttpClient) is (the snippet actually updates an existing document)

public static void main(String[] args) {
    String fileName = args[0];
    String URL = "http://localhost:8080/alfresco/upload/workspace/SpacesStore/71ee6b00-c473-4fe1-be97-40bc5d6cf80f/";
    PutMethod filePost = null;
    HttpClient client = null;
    try {
      String ticket = getTicket();
      filePost = new PutMethod(URL+fileName+"?ticket="+ticket);
      File mFile = new File(fileName);
      FilePartSource fileSource = new FilePartSource(mFile);
      Part[] parts = {
          new FilePart(fileName, fileSource)
      };
      filePost.setRequestEntity(
          new MultipartRequestEntity(parts, filePost.getParams())
      );
      client = new HttpClient();
      client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
      int status = client.executeMethod(filePost);
      if (status == HttpStatus.SC_OK) {
        System.out.println("Upload success");
      } else {
        System.out.println("Upload failed: " + HttpStatus.getStatusText(status));
      }

Did I miss something important?
Thanks in advance
Alex

p.s. If you need the full code I may provide id as well
3 REPLIES 3

ale_carraro
Champ in-the-making
Champ in-the-making
The problem was I thought that the servlet looked for Multipart HTTP PUT, as described in http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
Instead, it uses the request content as-is, so I should modify

FilePartSource fileSource = new FilePartSource(mFile);
      Part[] parts = {
          new FilePart(fileName, fileSource)
      };
      filePost.setRequestEntity(
          new MultipartRequestEntity(parts, filePost.getParams())
      );
With
filePost.setRequestBody(new FileInputStream(mFile));

lakshya
Champ in-the-making
Champ in-the-making
Hello,
I tried using the code :

      String fileName = "C:/temp/test.pdf";
      String URL = "http://localhost:9090/alfresco/upload/workspace/SpacesStore/00c248bf-3385-4fa7-848b-a2d6a74a9759/";
      PutMethod filePost = null;
      HttpClient client = null;
      try {
         //String ticket = getTicket();
         String ticket = "TICKET_70a632f462cdb111fa9ada7d4d9213e497393672";
         filePost = new PutMethod(URL + "test.pdf" +"?ticket=" + ticket);
         File mFile = new File(fileName);
         FilePartSource fileSource = new FilePartSource(mFile);
         Part[] parts = { new FilePart(fileName, fileSource) };
         filePost.setRequestEntity(new MultipartRequestEntity(parts,
               filePost.getParams()));
         client = new HttpClient();
         client.getHttpConnectionManager().getParams().setConnectionTimeout(
               5000);
         int status = client.executeMethod(filePost);
         System.out.println(filePost.getResponseBodyAsString());
         if (status == HttpStatus.SC_OK) {
            System.out.println("Upload success");
         } else {
            System.out.println("Upload failed: "
                  + HttpStatus.getStatusText(status));
         }
      } catch (Exception e) {

      }
   

I get the response body as success. But i can not see the content uploaded in Alfresco Explorer.
I analyzed the alf_data, and alf_data is having the entry of the created node, but their is no entry of that contentUrl in the database.

Am I missing something?
Please send the pointers, its very urgent…..

Regards
Lakshya

kits
Champ in-the-making
Champ in-the-making
<spoon feeding start>

1. initialize


    private void initialize() throws UploadFault{
       log.info("start call to AlfrescoUploadContent.initialize");
       
        try {
           
            String strAlfrescoWsUrl = props.getProperty("alfresco.ws.url");
            log.info("strAlfrescoWsUrl: " + strAlfrescoWsUrl);
            WebServiceFactory.setEndpointAddress(strAlfrescoWsUrl);
            repositoryServiceStub = WebServiceFactory.getRepositoryService();
           
            String alfrescoHost = props.getProperty("alfresco.port");
            int alfrescoPort = Integer.valueOf(props.getProperty("alfresco.port"));
            HttpParams params = new BasicHttpParams();
       
            ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);
            HttpHost ahost = new HttpHost(alfrescoHost, alfrescoPort);
            connPerRoute.setMaxForRoute(new HttpRoute(ahost), 200);
            ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
       
            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), alfrescoPort));
            ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
            client = new DefaultHttpClient(cm, params);
           
            responseHandler = new BasicResponseHandler();
           
            strUtil = new StringUtil();
            specialChars = props.getProperty("special.characters");
            log.info("specialChars: " + specialChars);
            specialCharsReplacement = props.getProperty("special.characters.replacement");
            log.info("specialCharsReplacement: " + specialCharsReplacement);

        } catch (Exception e) {
         
            log.error("initialization error: ", e);
            UploadFault fault = new UploadFault();
            UploadFaultMsg msg = fault.getFaultInfo();
            msg.setErrorMessage(e.getMessage());
            throw fault;
           
      }
      
       log.info("done call to AlfrescoUploadContent.initialize");
    }

2. start session


    private void startSession() throws UploadFault {
       log.info("start call to AlfrescoUploadContent.startSession");
       
        String strUser = props.getProperty("alfresco.user");
        String strPassword = props.getProperty("alfresco.password");
       
        try {
           
            AuthenticationUtils.startSession(strUser, strPassword);
            String strTicket = AuthenticationUtils.getTicket();
            log.info("strTicket: " + strTicket);
           
        } catch (AuthenticationFault e) {
           
            log.error("authentication error: ", e);
            UploadFault fault = new UploadFault();
            UploadFaultMsg msg = fault.getFaultInfo();
            msg.setErrorMessage(e.getMessage());
            throw fault;
           
        }
       
       log.info("done call to AlfrescoUploadContent.startSession");
    }

3. upload physical content: strContentData = uploadContent(req.getFileUrl(), req.getFileName());


    private String uploadContent(String fileUrl, String strFileName) throws UploadFault {
       
        String strTicket = AuthenticationUtils.getTicket();
       
        StringBuffer strBuffUploadUrl = new StringBuffer("http://");
        strBuffUploadUrl.append(props.getProperty("alfresco.host"));
        strBuffUploadUrl.append(":").append(props.getProperty("alfresco.port"));
        strBuffUploadUrl.append("/").append(props.getProperty("alfresco.context"));
        strBuffUploadUrl.append("/upload");
        strBuffUploadUrl.append("/").append(strFileName);
        strBuffUploadUrl.append("?ticket=");
        strBuffUploadUrl.append(strTicket);
       
        String strUploadUrl = strBuffUploadUrl.toString();
        log.info("strUploadUrl: " + strUploadUrl);
       
        HttpPut putFile = new HttpPut(strUploadUrl);
       
        URL url;
        InputStream is;
        String responseBody = null;
        try {

            url = new URL(fileUrl);
            is = url.openStream();
            InputStreamEntity ise = new InputStreamEntity(is, -1);
            putFile.setEntity(ise);
            responseBody = client.execute(putFile, responseHandler);
            log.info("responseBody: " + responseBody);

        } catch (MalformedURLException e) {
            log.error("MalformedURLException!", e);
            throw new UploadFault(e.getMessage());
        } catch (ClientProtocolException e) {
            log.error("ClientProtocolException!", e);
            throw new UploadFault(e.getMessage());
        } catch (IOException e) {
            log.error("ClientProtocolException!", e);
            throw new UploadFault(e.getMessage());
        }
       
        return responseBody;
    }

4. create logical content: uploadCMLContent(parentRef, req, strContentData);


    private UploadResponse uploadCMLContent(ParentReference parentRef, UploadRequest req, String strContentData) throws UploadFault {
        UploadResponse res = new UploadResponse();
       
        log.info("req.getFileName(): " + req.getFileName());
        String strFileName = req.getFileName();
       
        parentRef.setChildName("cm:" + strFileName);
       
        // Create the logical content
        NamedValue[] properties = new NamedValue[]
        {
            Utils.createNamedValue(Constants.PROP_NAME, strFileName),
            Utils.createNamedValue(Constants.PROP_CONTENT, strContentData)
        };

        CMLCreate create = new CMLCreate("1", parentRef, null, null, null, Constants.TYPE_CONTENT, properties);
        CML cml = new CML();
        cml.setCreate(new CMLCreate[] { create });
       
        List<FormField> formFields = req.getFormFields();
        log.info("formFields.size(): " + formFields.size());
       
        NamedValue[] aspectsCommon = new NamedValue[12];
        aspectsCommon[0] = Utils.createNamedValue(DMSConstants.PROP_TRACK_NO, req.getTrackNo());
        aspectsCommon[1] = Utils.createNamedValue(DMSConstants.PROP_EMAIL, req.getEmail());
        aspectsCommon[2] = Utils.createNamedValue(DMSConstants.PROP_ROLE, req.getRole());
        aspectsCommon[3] = Utils.createNamedValue(DMSConstants.PROP_FILENAME, req.getFileName());
        aspectsCommon[4] = Utils.createNamedValue(DMSConstants.PROP_FILEURL, req.getFileUrl());
        aspectsCommon[5] = Utils.createNamedValue(DMSConstants.PROP_DOCTYPE, req.getDoctype());
        aspectsCommon[6] = Utils.createNamedValue(DMSConstants.PROP_DESTINATIONDIR, req.getDestinationdir());
        aspectsCommon[7] = Utils.createNamedValue(DMSConstants.PROP_PROCESS, req.getProcess());
        aspectsCommon[8] = Utils.createNamedValue(DMSConstants.PROP_SUBPROCESS, req.getSubProcess());
        aspectsCommon[9] = Utils.createNamedValue(DMSConstants.PROP_ENTITY, req.getEntity());
        aspectsCommon[10] = Utils.createNamedValue(DMSConstants.PROP_VERSION, req.getVersion());
        aspectsCommon[11] = Utils.createNamedValue(DMSConstants.PROP_ALFRESCO_ENDPOINTURL, req.getAlfrescoEndpointUrl());
       
        CMLAddAspect addAspectCommon = new CMLAddAspect(DMSConstants.ASPECT_COMMON, aspectsCommon, null, "1");
       
        CMLAddAspect[] addAspects = new CMLAddAspect[2];
        addAspects[0] = addAspectCommon;
       
        // iterate formFields and add as aspects to the new content
        if (formFields.size() != 0) {
            NamedValue[] aspects = new NamedValue[formFields.size()];
            for (int aspectCtr = 0; aspectCtr != formFields.size(); aspectCtr++) {
                FormField ff = (FormField)formFields.get(aspectCtr);
                log.info("ff.getFieldValue(): " + ff.getFieldValue());
                StringBuffer aspectField = new StringBuffer("metadata").append(aspectCtr+1);
                aspects[aspectCtr] = Utils.createNamedValue(DMSConstants.createQNameString(
                        DMSConstants.DMS_NAMESPACE_CONTENT_MODEL, aspectField.toString()), ff.getFieldValue());
            }
           
            CMLAddAspect addAspectMetadata = new CMLAddAspect(DMSConstants.ASPECT_METADATA, aspects, null, "1");
            addAspects[1] = addAspectMetadata;
        }
       
        cml.setAddAspect(addAspects);
       
        UpdateResult[] result = null;
       
        try {
            result = repositoryServiceStub.update(cml);
        } catch (RepositoryFault e) {
            log.error("RepositoryFault!", e);
            throw new UploadFault("RepositoryFault!", e);
        } catch (RemoteException e) {
            log.error("RemoteException!", e);
            throw new UploadFault("RemoteException!", e);
        }

        log.info("getPath(): " + result[0].getDestination().getPath());
        String strUuid = result[0].getDestination().getUuid();
        log.info("getUuid(): " + strUuid);
        String strDestStoreAddress = result[0].getDestination().getStore().getAddress();
        log.info("getAddress(): " + strDestStoreAddress);

        String strAfrescoUrl = props.getProperty("alfresco.url.prefix");
       
        String dmsUrl = strAfrescoUrl + strDestStoreAddress + "/" + strUuid + "/" + req.getFileName();
        res.setDmsFileUrl(dmsUrl);
        res.setStatus("0");
        res.setMessage("Successfully uploaded file in DMS!");
        return res;
    }

</spoon feeding end>
:wink:
HTH,
edwin quita