Exemplo n.º 1
0
            public async Task <Result <HttpResponseMessage> > DownloadAnnotations(DownloadAnnotationsRequest request)
            {
                const string api = "api/Factory/DownloadAnnotations";

                NameValueCollection query = HttpUtility.ParseQueryString(string.Empty);

                if (request.DocumentId != null)
                {
                    query["documentId"] = request.DocumentId;
                }
                if (request.Uri != null)
                {
                    query["uri"] = request.Uri.ToString();
                }

                Result <HttpResponseMessage> result = await _owner.GetAsyncMessage(api, query);

                return(result);
            }
        public HttpResponseMessage DownloadAnnotations([FromUri] DownloadAnnotationsRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }

            if ((request.DocumentId == null && request.Uri == null) || (request.DocumentId != null && request.Uri != null))
            {
                throw new InvalidOperationException("DocumentId or Uri must not be null, but not both");
            }

            var cache = ServiceHelper.Cache;
            DocumentCacheInfo cacheInfo;

            if (request.Uri != null)
            {
                cacheInfo = DocumentFactory.GetDocumentCacheInfo(cache, request.Uri);
            }
            else
            {
                cacheInfo = DocumentFactory.GetDocumentCacheInfo(cache, request.DocumentId);
            }
            DocumentHelper.CheckCacheInfo(cacheInfo);

            var name = "download";

            if (!string.IsNullOrEmpty(cacheInfo.Name))
            {
                var documentMimeType  = cacheInfo.MimeType;
                var documentExtension = RasterCodecs.GetMimeTypeExtension(documentMimeType);
                name = ServiceHelper.RemoveExtension(cacheInfo.Name, documentExtension);
            }

            var annotationsName = string.Format("{0}_ann.xml", name);

            var responseFileName    = annotationsName;
            var responseContentType = "application/xml";

            var documentId = cacheInfo.DocumentId;

            Action <Stream, HttpContent, TransportContext> write = (outputStream, content, context) =>
            {
                DocumentFactory.DownloadAnnotations(cache, documentId, 0, -1, outputStream);
                outputStream.Close();
            };

            var response = new HttpResponseMessage(HttpStatusCode.OK);

            // For "Save to Google Drive" access, we must have the appropriate CORS headers.
            // See https://developers.google.com/drive/v3/web/savetodrive
            response.Headers.Remove("Access-Control-Allow-Headers");
            response.Headers.Add("Access-Control-Allow-Headers", "Range");
            response.Headers.Remove("Access-Control-Expose-Headers");
            response.Headers.Add("Access-Control-Expose-Headers", "Cache-Control, Content-Encoding, Content-Range");

            response.Content = new PushStreamContent(write, new MediaTypeHeaderValue(responseContentType));

            ServiceHelper.SetResponseViewFileName(response, responseFileName, responseContentType);

            return(response);
        }