Last active
May 6, 2020 18:57
-
-
Save Kuranes/bbd688ab422ffb844ed3 to your computer and use it in GitHub Desktop.
Sketchfab Upload using c# .net
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.IO; | |
using System.Linq; | |
using System.Net; | |
using System.Security.Cryptography.X509Certificates; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace Test | |
{ | |
public static class FormUpload | |
{ | |
private static readonly Encoding encoding = Encoding.UTF8; | |
public static HttpWebResponse MultipartFormDataPost(string postUrl, | |
string userAgent, Dictionary<string, object> postParameters) | |
{ | |
string formDataBoundary = String.Format("----------{0:N}", | |
Guid.NewGuid()); | |
string contentType = "multipart/form-data; boundary=" + | |
formDataBoundary; | |
byte[] formData = GetMultipartFormData(postParameters, | |
formDataBoundary); | |
return PostForm(postUrl, userAgent, contentType, formData); | |
} | |
private static HttpWebResponse PostForm(string postUrl, string | |
userAgent, string contentType, byte[] formData) | |
{ | |
HttpWebRequest request = WebRequest.Create(postUrl) as | |
HttpWebRequest; | |
if (request == null) | |
{ | |
throw new NullReferenceException("request is not a http | |
request"); | |
} | |
// Set up the request properties. | |
request.Method = "POST"; | |
request.ContentType = contentType; | |
request.UserAgent = userAgent; | |
request.CookieContainer = new CookieContainer(); | |
request.ContentLength = formData.Length; | |
// You could add authentication here as well if needed: | |
// request.PreAuthenticate = true; | |
// request.AuthenticationLevel = | |
System.Net.Security.AuthenticationLevel.MutualAuthRequested; | |
// request.Headers.Add("Authorization", "Basic " + | |
Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("username" + | |
":" + "password"))); | |
// Send the form data to the request. | |
using (Stream requestStream = request.GetRequestStream()) | |
{ | |
requestStream.Write(formData, 0, formData.Length); | |
requestStream.Close(); | |
} | |
return request.GetResponse() as HttpWebResponse; | |
} | |
private static byte[] GetMultipartFormData(Dictionary<string, | |
object> postParameters, string boundary) | |
{ | |
Stream formDataStream = new System.IO.MemoryStream(); | |
bool needsCLRF = false; | |
foreach (var param in postParameters) | |
{ | |
// Thanks to feedback from commenters, add a CRLF to allow | |
multiple parameters to be added. | |
// Skip it on the first parameter, add it to subsequent | |
parameters. | |
if (needsCLRF) | |
formDataStream.Write(encoding.GetBytes("\r\n"), 0, | |
encoding.GetByteCount("\r\n")); | |
needsCLRF = true; | |
if (param.Value is FileParameter) | |
{ | |
FileParameter fileToUpload = (FileParameter)param.Value; | |
// Add just the first part of this param, since we will | |
write the file data directly to the Stream | |
string header = | |
string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; | |
filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", | |
boundary, | |
param.Key, | |
fileToUpload.FileName ?? param.Key, | |
fileToUpload.ContentType ?? | |
"application/octet-stream"); | |
formDataStream.Write(encoding.GetBytes(header), 0, | |
encoding.GetByteCount(header)); | |
// Write the file data directly to the Stream, rather | |
than serializing it to a string. | |
formDataStream.Write(fileToUpload.File, 0, | |
fileToUpload.File.Length); | |
} | |
else | |
{ | |
string postData = | |
string.Format("--{0}\r\nContent-Disposition: form-data; | |
name=\"{1}\"\r\n\r\n{2}", | |
boundary, | |
param.Key, | |
param.Value); | |
formDataStream.Write(encoding.GetBytes(postData), 0, | |
encoding.GetByteCount(postData)); | |
} | |
} | |
// Add the end of the request. Start with a newline | |
string footer = "\r\n--" + boundary + "--\r\n"; | |
formDataStream.Write(encoding.GetBytes(footer), 0, | |
encoding.GetByteCount(footer)); | |
// Dump the Stream into a byte[] | |
formDataStream.Position = 0; | |
byte[] formData = new byte[formDataStream.Length]; | |
formDataStream.Read(formData, 0, formData.Length); | |
formDataStream.Close(); | |
return formData; | |
} | |
public class FileParameter | |
{ | |
public byte[] File { get; set; } | |
public string FileName { get; set; } | |
public string ContentType { get; set; } | |
public FileParameter(byte[] file) : this(file, null) { } | |
public FileParameter(byte[] file, string filename) : this(file, | |
filename, null) { } | |
public FileParameter(byte[] file, string filename, string | |
contenttype) | |
{ | |
File = file; | |
FileName = filename; | |
ContentType = contenttype; | |
} | |
} | |
} | |
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
// Read file data | |
FileStream fs = new FileStream("c:\\Exports.zip", | |
FileMode.Open, FileAccess.Read); | |
byte[] data = new byte[fs.Length]; | |
fs.Read(data, 0, data.Length); | |
fs.Close(); | |
// Generate post objects | |
Dictionary<string, object> postParameters = new Dictionary<string, | |
object>(); | |
postParameters.Add("token", "**mytoken***"); | |
postParameters.Add("name", "mymodeltitle"); | |
postParameters.Add("modelFile", new FormUpload.FileParameter(data, | |
"Exports.zip", "application/zip")); | |
// Create request and receive response | |
string postURL = "https://api.sketchfab.com/v2/models"; | |
string userAgent = "Someone"; | |
HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postURL, | |
userAgent, postParameters); | |
// Process response | |
StreamReader responseReader = new | |
StreamReader(webResponse.GetResponseStream()); | |
string fullResponse = responseReader.ReadToEnd(); | |
webResponse.Close(); | |
//Response.Write(fullResponse); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This code is valid even for the newest version of the api the version 3 (https://api.sketchfab.com/v3/models) ? I'm asking becuase i receveid the error 401 from the server like it is a non valid operation.