| <!DOCTYPE html> |
| <!-- |
| |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
| --> |
| <html lang="en"> |
| |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <meta name="author" content="Apache Chemistry"> |
| <link rel="shortcut icon" href="../../img/favicon.ico"> |
| |
| <title>Working with Content - Apache Chemistry Samples</title> |
| |
| <link href="../../css/bootstrap-custom.min.css" rel="stylesheet"> |
| <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet"> |
| <link href="../../css/base.css" rel="stylesheet"> |
| <link href="../../css/cinder.css" rel="stylesheet"> |
| <link rel="stylesheet" href="../../css/highlight.css"> |
| |
| |
| <link href="../../css/chemistry.css" rel="stylesheet"> |
| |
| <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries --> |
| <!--[if lt IE 9]> |
| <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
| <script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
| <![endif]--> |
| |
| |
| </head> |
| |
| <body> |
| |
| <div class="navbar navbar-default navbar-fixed-top" role="navigation"> |
| <div class="container"> |
| |
| <!-- Collapsed navigation --> |
| <div class="navbar-header"> |
| |
| <!-- Expander button --> |
| <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> |
| <span class="sr-only">Toggle navigation</span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| |
| |
| <!-- Main title --> |
| <a class="navbar-brand" href="../../index.html">Apache Chemistry Samples</a> |
| </div> |
| |
| <!-- Expanded navigation --> |
| <div class="navbar-collapse collapse"> |
| |
| <!-- Main navigation --> |
| <ul class="nav navbar-nav"> |
| |
| |
| <li > |
| <a href="../../index.html">Home</a> |
| </li> |
| |
| |
| |
| <li class="dropdown"> |
| <a href="#" class="dropdown-toggle" data-toggle="dropdown">Repository <b class="caret"></b></a> |
| <ul class="dropdown-menu"> |
| |
| |
| <li > |
| <a href="../create-session/index.html">Creating a Session</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../capabilities/index.html">Getting Repository Capabilities</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../types/index.html">Working with Types</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../exceptions/index.html">CMIS Exceptions</a> |
| </li> |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class="dropdown active"> |
| <a href="#" class="dropdown-toggle" data-toggle="dropdown">CRUD <b class="caret"></b></a> |
| <ul class="dropdown-menu"> |
| |
| |
| <li > |
| <a href="../retrieve-objects/index.html">Retrieving Objects</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../create-objects/index.html">Creating Objects</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../update-objects/index.html">Updating Objects</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../move-objects/index.html">Moving Object</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../delete-objects/index.html">Deleting Objects</a> |
| </li> |
| |
| |
| |
| <li class="active"> |
| <a href="index.html">Working with Content</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../versions/index.html">Working with Versions</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../properties/index.html">Working with Properties and Secondary Types</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../operation-context/index.html">Understanding the Operation Context</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../lists/index.html">Working with Lists, Paging and Skipping</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../extensions/index.html">Getting Extensions</a> |
| </li> |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class="dropdown"> |
| <a href="#" class="dropdown-toggle" data-toggle="dropdown">Query <b class="caret"></b></a> |
| <ul class="dropdown-menu"> |
| |
| |
| <li > |
| <a href="../queries/index.html">Executing Queries</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../query-examples/index.html">Query Examples</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../changelog/index.html">Retrieving the Change Log</a> |
| </li> |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li class="dropdown"> |
| <a href="#" class="dropdown-toggle" data-toggle="dropdown">Access Control <b class="caret"></b></a> |
| <ul class="dropdown-menu"> |
| |
| |
| <li > |
| <a href="../allowable-actions/index.html">Checking Allowable Actions</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../access-control/index.html">Managing Access Control</a> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../retention/index.html">Retention and Holds</a> |
| </li> |
| |
| |
| </ul> |
| </li> |
| |
| |
| |
| <li > |
| <a href="../../about/index.html">About</a> |
| </li> |
| |
| |
| </ul> |
| |
| |
| <ul class="nav navbar-nav navbar-right"> |
| <li> |
| <a href="#" data-toggle="modal" data-target="#mkdocs_search_modal"> |
| <i class="fa fa-search" aria-hidden="true"></i> Search |
| </a> |
| </li> |
| |
| <li > |
| <a rel="next" href="../delete-objects/index.html"> |
| <i class="fa fa-arrow-left" aria-hidden="true"></i> Previous |
| </a> |
| </li> |
| <li > |
| <a rel="prev" href="../versions/index.html"> |
| Next <i class="fa fa-arrow-right" aria-hidden="true"></i> |
| </a> |
| </li> |
| |
| <li> |
| <a href="https://www.apache.org" style="padding: 2px;"> |
| <img src="../../img/feather.png"> |
| </a> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| |
| <div class="container"> |
| |
| <div class="col-md-3"><div class="bs-sidebar hidden-print affix well" role="complementary"> |
| <ul class="nav bs-sidenav"> |
| |
| <li class="first-level active"><a href="#working-with-content">Working with Content</a></li> |
| |
| <li class="second-level"><a href="#content-streams">Content Streams</a></li> |
| |
| |
| <li class="second-level"><a href="#mime-types">MIME Types</a></li> |
| |
| |
| <li class="second-level"><a href="#getting-content">Getting Content</a></li> |
| |
| <li class="third-level"><a href="#getting-partial-content">Getting Partial Content</a></li> |
| |
| <li class="third-level"><a href="#getting-a-content-url">Getting a Content URL</a></li> |
| |
| |
| <li class="second-level"><a href="#updating-content">Updating Content</a></li> |
| |
| <li class="third-level"><a href="#overwriting-content">Overwriting Content</a></li> |
| |
| <li class="third-level"><a href="#deleting-content">Deleting Content</a></li> |
| |
| <li class="third-level"><a href="#appending-content">Appending Content</a></li> |
| |
| |
| <li class="second-level"><a href="#working-with-renditions">Working with Renditions</a></li> |
| |
| <li class="third-level"><a href="#getting-the-list-of-renditions">Getting the List of Renditions</a></li> |
| |
| <li class="third-level"><a href="#getting-rendition-content">Getting Rendition Content</a></li> |
| |
| |
| |
| </ul> |
| </div></div> |
| <div class="col-md-9" role="main"> |
| |
| <h1 id="working-with-content">Working with Content</h1> |
| <p><span class="cmis">CMIS 1.0</span> |
| <span class="cmis">CMIS 1.1</span> |
| <span class="spec">Spec 2.1.4.2</span></p> |
| <h2 id="content-streams">Content Streams</h2> |
| <p>Content Stream objects are used to send and fetch content. They contain a file name, a <a href="#mime-types">MIME type</a>, the stream length, and the stream.</p> |
| <p>In some cases, the stream length is unknown (<code>null</code>). OpenCMIS and PortCMIS don’t rely on it and your application shouldn’t either. </p> |
| <p>You can create content stream objects manually or implement the interface yourself, but OpenCMIS and PortCMIS provide some convenience methods for this.</p> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">// create a simple ContentStream object |
| ContentStream cs1 = session.getObjectFactory().createContentStream(filename, length, mimeType, stream); |
| |
| // create a ContentStream object from a byte array |
| ContentStream cs2 = ContentStreamUtils.createByteArrayContentStream(filename, bytes, mimeType); |
| |
| // create a ContentStream object from a string |
| ContentStream cs3 = ContentStreamUtils.createTextContentStream(filename, content); |
| |
| // create a ContentStream object from file |
| ContentStream cs4 = ContentStreamUtils.createFileContentStream(file); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">// create a simple IContentStream object |
| IContentStream cs1 = Session.ObjectFactory.CreateContentStream(filename, length, mimeType, stream); |
| |
| // create a IContentStream object from a byte array |
| IContentStream cs2 = ContentStreamUtils.CreateByteArrayContentStream(filename, bytes, mimeType); |
| |
| // create a IContentStream object from a string |
| IContentStream cs3 = ContentStreamUtils.CreateTextContentStream(filename, content); |
| </code></pre> |
| |
| <h2 id="mime-types">MIME Types</h2> |
| <p>When you create a new document or update the content of a document, you have to provide a MIME type. |
| If you don’t know the MIME type, use <code>application/octet-stream</code>.</p> |
| <p>OpenCMIS can guess the MIME type based on the file extension. |
| If you need a more thorough MIME type detection, have a look at <a href="https://tika.apache.org/">Apache Tika</a>.</p> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">String mimeType = MimeTypes.getMIMEType("txt"); // MIME type for a .txt file |
| </code></pre> |
| |
| <p>For .Net 4.5+ you can use <a href="https://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping.aspx">System.Web.MimeMapping.GetMimeMapping</a>.</p> |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">string mimeType = MimeMapping.GetMimeMapping("text.txt"); |
| </code></pre> |
| |
| <h2 id="getting-content">Getting Content</h2> |
| <p><span class="cmis">CMIS 1.0</span> |
| <span class="cmis">CMIS 1.1</span></p> |
| <p>The code snippets below show how to get the content of document.</p> |
| <div class="admonition note"> |
| <p class="admonition-title">Note</p> |
| <p>CMIS differentiates between documents with no content and documents with a content of 0 bytes.<br /> |
| If a document has no content, <code>getContentStream()</code> returns <code>null</code>. If a document has a 0 byte content, <code>getContentStream()</code> returns a content stream object with an empty stream.</p> |
| </div> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| ContentStream contentStream = document.getContentStream(); |
| InputStream stream = contentStream.getStream(); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| IContentStream contentStream = document.GetContentStream(); |
| Stream stream = contentStream.Stream; |
| </code></pre> |
| |
| <h3 id="getting-partial-content">Getting Partial Content</h3> |
| <p><span class="cmis">CMIS 1.0</span> |
| <span class="cmis">CMIS 1.1</span></p> |
| <p>It’s also possible to get only a part of the content.</p> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| |
| // skip the first 100 bytes |
| // use null to start from the beginning |
| BigInteger offset = BigInteger.valueOf(100); |
| |
| // only read 200 bytes |
| // use null to read to the end of the stream |
| BigInteger length = BigInteger.valueOf(200); |
| |
| ContentStream contentStream = document.getContentStream(offset, length); |
| InputStream stream = contentStream.getStream(); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| |
| // skip the first 100 bytes |
| // use null to start from the beginning |
| long? offset = 100; |
| |
| // only read 200 bytes |
| // use null to read to the end of the stream |
| long? length = 200; |
| |
| IContentStream contentStream = document.GetContentStream(offset, length); |
| Stream stream = contentStream.Stream; |
| </code></pre> |
| |
| <h3 id="getting-a-content-url">Getting a Content URL</h3> |
| <p>The AtomPub Binding and the Browser Binding can provide a URL to the content of a document. Depending on the repository and the binding, the server might not return the content but an error message because this URL does not include authentication data. A user may have to re-authenticate to get the content.</p> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| |
| String link = document.getContentUrl(); |
| </code></pre> |
| |
| <h2 id="updating-content">Updating Content</h2> |
| <h3 id="overwriting-content">Overwriting Content</h3> |
| <p><span class="cmis">CMIS 1.0</span> |
| <span class="cmis">CMIS 1.1</span></p> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| |
| ContentStream contentStream = ... |
| |
| document.setContentStream(contentStream, true); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| |
| IContentStream contentStream = ... |
| |
| document.SetContentStream(contentStream, true); |
| </code></pre> |
| |
| <h3 id="deleting-content">Deleting Content</h3> |
| <p><span class="cmis">CMIS 1.0</span> |
| <span class="cmis">CMIS 1.1</span></p> |
| <div class="admonition warning"> |
| <p class="admonition-title">Warning</p> |
| <p>Some repositories don’t support documents without content. Check the <a href="../capabilities/index.html">repository capabilities</a> if that’s the case or check the |
| <a href="../allowable-actions/index.html">Allowable Actions</a> of the document.</p> |
| </div> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| document.deleteContentStream(); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| document.DeleteContentStream(); |
| </code></pre> |
| |
| <h3 id="appending-content">Appending Content</h3> |
| <p><span class="cmis">CMIS 1.1</span></p> |
| <div class="admonition warning"> |
| <p class="admonition-title">Warning</p> |
| <p>Not all repositories support appending content. It is not possible to discover wheter a repository supports it or not. |
| If you append content be prepared to catch a <a href="../exceptions/index.html">notSupported</a> exception. </p> |
| </div> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| |
| ContentStream contentStream = ... |
| boolean isLastChunk = true; // indicates that this is the last part of the content |
| |
| document.appendContentStream(contentStream, isLastChunk); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| |
| IContentStream contentStream = ... |
| bool isLastChunk = true; // indicates that this is the last part of the content |
| |
| document.AppendContentStream(contentStream, isLastChunk); |
| </code></pre> |
| |
| <h2 id="working-with-renditions">Working with Renditions</h2> |
| <p><span class="cmis">CMIS 1.0</span> |
| <span class="cmis">CMIS 1.1</span> |
| <span class="spec">Spec 2.1.4.2</span></p> |
| <p>Renditions are alternative versions of a document. For example, a rendition could be a PDF of an Office document. Thumbnails are a special kind of renditions and could also exist for non-document objects.<br /> |
| CMIS only supports server managed renditions. A CMIS client cannot upload, modify, or delete a rendition.</p> |
| <h3 id="getting-the-list-of-renditions">Getting the List of Renditions</h3> |
| <div class="admonition note"> |
| <p class="admonition-title">Note</p> |
| <p>The list of renditions is only available if it has been requested with an <a href="../operation-context/index.html#rendition-filter">Operation Context</a>.</p> |
| </div> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| |
| for (Rendition rendition: document.getRenditions()) { |
| System.out.println(rendition.getTitle() + ": " + rendition.getStreamId()); |
| } |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| |
| foreach (IRendition rendition in folder.Renditions) { |
| Console.WriteLine(rendition.Title + ": " + rendition.StreamId); |
| } |
| </code></pre> |
| |
| <h3 id="getting-rendition-content">Getting Rendition Content</h3> |
| <p>The rendition content can be retrieved either for an Rendition object (see above) or directly from the document with a stream ID.</p> |
| <p class="opencmis">OpenCMIS (Java)</p> |
| <pre><code class="java">Document document = ... |
| Rendition rendition = ... |
| |
| ContentStream cs1 = document.getContentStream(rendition.getStreamId()); |
| |
| ContentStream cs2 = rendition.getContentStream(); |
| </code></pre> |
| |
| <p class="portcmis">PortCMIS (C#)</p> |
| <pre><code class="csharp">IDocument document = ... |
| IRendition rendition = ... |
| |
| IContentStream cs1 = document.GetContentStream(rendition.StreamId); |
| |
| IContentStream cs2 = rendition.GetContentStream(); |
| </code></pre></div> |
| |
| </div> |
| |
| <footer class="col-md-12 text-center"> |
| <hr> |
| <p> |
| </footer> |
| |
| <script src="../../js/jquery-1.10.2.min.js"></script> |
| <script src="../../js/bootstrap-3.0.3.min.js"></script> |
| <script src="../../js/highlight.pack.js"></script> |
| <script>hljs.initHighlightingOnLoad();</script> |
| <script> |
| var base_url = '../..'; |
| </script> |
| <script data-main="../../mkdocs/js/search.js" src="../../mkdocs/js/require.js"></script> |
| <script src="../../js/base.js"></script> |
| |
| <div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="Search Modal" aria-hidden="true"> |
| <div class="modal-dialog"> |
| <div class="modal-content"> |
| <div class="modal-header"> |
| <button type="button" class="close" data-dismiss="modal"> |
| <span aria-hidden="true">×</span> |
| <span class="sr-only">Close</span> |
| </button> |
| <h4 class="modal-title" id="exampleModalLabel">Search</h4> |
| </div> |
| <div class="modal-body"> |
| <p> |
| From here you can search these documents. Enter your search terms below. |
| </p> |
| <form role="form"> |
| <div class="form-group"> |
| <input type="text" class="form-control" placeholder="Search..." id="mkdocs-search-query"> |
| </div> |
| </form> |
| <div id="mkdocs-search-results"></div> |
| </div> |
| <div class="modal-footer"> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <script type="text/javascript" src="../../js/retina.min.js"></script> |
| </body> |
| |
| </html> |
| <!-- last update: 2017-07-31 12:45:42 --> |