commodore73

Prototype .NET Class Uploads Media Assets to Contentstack

Apr 6th, 2021 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.97 KB | None | 0 0
  1. namespace ContentstackAssetImporter
  2. {
  3.     using System;
  4.     using System.Collections.Specialized;
  5.     using System.IO;
  6.     using System.Net;
  7.     using System.Text;
  8.     internal class AssetUploader
  9.     {
  10.         public string Upload(AssetInfo assetInfo)
  11.         {
  12.             // marker between multipart HTTP elements
  13.             string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
  14.             byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
  15.  
  16.             // https://www.contentstack.com/docs/developers/apis/content-management-api/#upload-asset
  17.             string url = "https://api.contentstack.io/v3/assets?include_dimensions=true";
  18.             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  19.             request.ContentType = "multipart/form-data; boundary=" + boundary;
  20.             request.Method = "POST";
  21.             request.KeepAlive = true;
  22.             request.Headers["api_key"] = "//TODO: don't hard-code me";
  23.             request.Headers["authorization"] = "//TODO: don't hard-code me";
  24.  
  25.             // temporary to get size for request.ContentLength
  26.             MemoryStream memoryStream = new MemoryStream();
  27.             NameValueCollection formFields = new NameValueCollection();
  28.             formFields["asset[title]"] = assetInfo.Title; //minus any special chars or with any substitutions?
  29.             formFields["asset[description]"] = assetInfo.Description;
  30.  
  31.             if (assetInfo.Tags != null && assetInfo.Tags.Length > 0)
  32.             {
  33.                 formFields["asset[tags]"] = String.Join(",", assetInfo.Tags);
  34.             }
  35.  
  36.             if (!String.IsNullOrEmpty(assetInfo.FolderUid))
  37.             {
  38.                 formFields["asset[parent_uid]"] = assetInfo.FolderUid;
  39.             }
  40.  
  41.             // format form element values for multipart HTTP
  42.             string formElement = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
  43.  
  44.             foreach (string key in formFields.Keys)
  45.             {
  46.                 memoryStream.Write(boundaryBytes, 0, boundaryBytes.Length);
  47.                 string formitem = string.Format(formElement, key, formFields[key]);
  48.                 byte[] formitembytes = Encoding.ASCII.GetBytes(formitem);
  49.                 memoryStream.Write(formitembytes, 0, formitembytes.Length);
  50.             }
  51.  
  52.             memoryStream.Write(boundaryBytes, 0, boundaryBytes.Length);
  53.  
  54.             // get from registry if possible? Registry.GetValue(@"HKEY_CLASSES_ROOT\.pdf", "Content Type", null) as string;
  55.             string mimeType = assetInfo.FileInfo.Extension.TrimStart('.').ToLower();
  56.  
  57.             switch(mimeType)
  58.             {
  59.                 case "jpg":
  60.                 case "jpeg":
  61.                     mimeType = "image/jpeg";
  62.                     break;
  63.                 case "png":
  64.                     mimeType = "image/png";
  65.                     break;
  66.                 default:
  67.                     Console.WriteLine("No MIME type for " + mimeType);
  68.                     break;
  69.             }
  70.  
  71.             // encode file for multipart HTTP
  72.             byte[] fileHeaderBytes = Encoding.UTF8.GetBytes(String.Format(
  73.                 "Content-Disposition: form-data; name=\"asset[upload]\"; filename=\"{0}\"\r\nContent-Type: {1}\r\n\r\n",
  74.                 assetInfo.FileInfo.Name,
  75.                 mimeType));
  76.             memoryStream.Write(fileHeaderBytes, 0, fileHeaderBytes.Length);
  77.  
  78.             // encode the file into the HTTP request body
  79.             byte[] buffer = new byte[65536];
  80.             using (FileStream fileStream = new FileStream(assetInfo.FileInfo.FullName, FileMode.Open, FileAccess.Read))
  81.             {
  82.                 int bytesRead = 0;
  83.  
  84.                 while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
  85.                 {
  86.                     memoryStream.Write(buffer, 0, bytesRead);
  87.                 }
  88.             }
  89.  
  90.             // close the HTTP body
  91.             byte[] footerElement = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
  92.             memoryStream.Write(footerElement, 0, footerElement.Length);
  93.  
  94.             request.ContentLength = memoryStream.Length;
  95.  
  96.             // write memory stream to request body
  97.             using (Stream requestStream = request.GetRequestStream())
  98.             {
  99.                 memoryStream.Position = 0;
  100.                 byte[] tempBuffer = new byte[memoryStream.Length];
  101.                 memoryStream.Read(tempBuffer, 0, tempBuffer.Length);
  102.                 memoryStream.Close();
  103.                 requestStream.Write(tempBuffer, 0, tempBuffer.Length);
  104.             }
  105.  
  106.             // send request and return response as string.
  107.             // TODO: Any potential benefit to GetResponseAsync over GetResponse() here?
  108.             using (Stream responseStream = ((HttpWebResponse)
  109.                 request.GetResponseAsync().Result).GetResponseStream())
  110.             {
  111.                 return new StreamReader(responseStream).ReadToEnd();
  112.             }
  113.         }
  114.     }
  115. }
  116.  
Add Comment
Please, Sign In to add comment