cancel
Showing results for 
Search instead for 
Did you mean: 

CMIS setContentStream problem

jake-hyland
Champ in-the-making
Champ in-the-making
Hey all,

I have been working on a CMIS access layer in C#, and I have run into an issue that I cannot figure out. I am trying to set the content stream of a checked out document before checking it in.

When I create a document from a file on my local machine, everything works fine. The document is created and returned, and I can retrieve the content of the document. The problem occurs when I am updating the content stream of a checked in document. When I run the code below, the content stream is updated, but as far as I can tell the base64 encoded content is not decoded. all files that I update with this code get turned into plain text files containing base64 strings, but they keep their original file extensions.

I have examined the specification (0.5), and the way I interpret that version of setContentStream is to send the raw bits over as the PUT content, but if I do this (code not shown because it's simple) i get a 500 internal server error.

Any help would be very appreciated.

Here is my save to server code:

        /// <summary>
        /// Commits the changes to the document's data back to the server.
        /// </summary>
        public void Commit()
        {
            if(_contentChanged)
            {
                XDeclaration dec = new XDeclaration("1.0", "utf-8", "no");
                XNamespace atom = "http://www.w3.org/2005/Atom";
                XElement ele =
                    new XElement(atom + "entry",
                    new XElement(atom + "title", Title),
                        new XElement(atom + "content", Convert.ToBase64String(_data),
                            new XAttribute("type", MimeType),
                            new XAttribute("encoding", "base64")
                        )
                    );
                byte[] data = System.Text.Encoding.UTF8.GetBytes(dec.ToString() + ele.ToString());
                _repo.Server.PutRequest(_editMedia, data, "application/atom+xml;type=entry", new WebHeaderCollection());
            }
        }
and the PutRequest method:

        /// <summary>
        /// Executes an HTTP POST against a URI.
        /// </summary>
        /// <param name="uri">The URI to send the POST to.</param>
        /// <param name="data">The data to include in the POST</param>
        /// <param name="contentType">The MIME content type of the post.</param>
        /// <param name="headers">The PUT headers for this request.</param>
        /// <returns>The response stream.</returns>
        internal Stream PutRequest(Uri uri, byte[] data, string contentType, WebHeaderCollection headers)
        {
            try
            {
                WebRequest request = WebRequest.Create(uri);
                request.Headers = headers;
                request.Method = "PUT";
                request.Credentials = _credentials;
                request.ContentType = contentType;
                using(Stream str = request.GetRequestStream())
                {
                    str.Write(data, 0, data.Length);
                }
                WebResponse response = request.GetResponse();
                return response.GetResponseStream();
            }
            catch(WebException e)
            {
                throw new CmisException(uri, "There was a problem submitting the PUT request.", e);
            }
        }

For those not familiar with C#, what this does is create an ATOM entry for the document, enclosing the content in a base64 string, and then encoding the whole thing in Utf-8 for transfer.
2 REPLIES 2

davidc
Star Contributor
Star Contributor
Hi,

Looks like you've hit limitations of the early implementation of Alfresco CMIS.

The latest HEAD fixes update with Base64 encoded content and also provides the setContentStream implementation.

jake-hyland
Champ in-the-making
Champ in-the-making
Thank you for the reply, David.

Is there a workaround that you know of for the version I have (3.0 Stable), or is the only way to compile from the source? I'm not set on submitting via base64, I just want to be able to update the content.

Also, is there a place I can see the status of what parts of the CMIS spec are working? This would prevent me from banging my head against the keyboard for little to no reason in the future!