将图像上传到REST API的问题.. !!

编程入门 行业动态 更新时间:2024-10-28 16:27:35
本文介绍了将图像上传到REST API的问题.. !!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试将图片上传到restApi,但它会引发内部服务器错误。 请考虑我的代码并指导我在哪里找不到的东西

public void UploadAsset( string sToken, string sImage) { string sRes = string .Empty; Uri地址= new Uri( services-sandbox.sheerid/rest/0.5/asset); // 创建网络请求 HttpWebRequest oHttpWebRequest = WebRequest .Create(address) as HttpWebRequest; oHttpWebRequest.Credentials = new NetworkCredential( mrinalkumarjha, ******); oHttpWebRequest.Headers [ 授权] = Bearer 624a3eef46f79772958693fa87118b29; oHttpWebRequest.Method = POST; oHttpWebRequest.ContentType = multipart / form-data; // 创建我们要发送的数据 string sFile = asset.png; StringBuilder data = new StringBuilder(); data.Append( file = + HttpUtility.UrlEncode(@sFile)); data.Append( & failure = + HttpUtility.UrlEncode( 您的网址)); data.Append( & succes = + HttpUtility.UrlEncode( 您的网址)); data.Append( & token = + HttpUtility.UrlEncode(txtToken.Text )); // 创建我们要发送的数据的字节数组 byte [] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); // 在请求标题中设置内容长度 oHttpWebRequest.ContentLength = byteData.Length; // 写入数据。 使用(Stream postStream = oHttpWebRequest.GetRequestStream()) { postStream.Write(byteData, 0 ,byteData.Length); } // 获取回复 使用(HttpWebResponse响应= oHttpWebRequest.GetResponse()作为 HttpWebResponse) { // 获取响应流 StreamReader reader = new StreamReader(response.GetResponseStream()); // 控制台应用程序输出 sRes = reader.ReadToEnd (); } }

已添加代码块[/ Edit]

解决方案

我已经解决了..在类文件中添加以下内容。 private static readonly编码encoding = Encoding.UTF8; 公共静态HttpWebResponse MultipartFormDataPost(串postUrl,串的userAgent,字典<字符串> postParameters) { 串formDataBoundary =的String.Format( - --------- {0:N},Guid.NewGuid()); string contentType =multipart / form-data; boundary =+ formDataBoundary; byte [] formData = GetMultipartFormData(postParameters,formDataBoundary); 返回PostForm(postUrl,userAgent,contentType, formData); } private static HttpWebResponse PostForm(string postUrl,string userAgent,string contentType,byte [] formData) { HttpWebRequest request = WebRequest.Create(postUrl)as HttpWebRequ est; if(request == null) { 抛出新的NullReferenceException(请求不是一个http请求); } //设置请求属性。 request.Method =POST; request.ContentType = contentType; request.UserAgent = userAgent; request.CookieContainer = new CookieContainer(); request.ContentLength = formData.Length; request.Credentials = new NetworkCredential(mrinalkumarjha,***** ); request.Headers [Authorization] =Bearer 624a3eef46f79772958693fa87118b29; //你也可以在这里添加身份验证需要: // request.PreAuthenticate = true; // request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested; // request.Headers.Add(Authorization,Basic+ Convert.ToBase64String(System.Text.Encoding.D efault.GetBytes(用户名+:+密码))); //将表单数据发送到请求。 using(Stream requestStream = request.GetRequestStream()) { requestStream.Write(formData,0,formData.Length); requestStream.Close(); } 返回request.GetResponse()as HttpWebResponse; } $ / $ private static byte [] GetMultipartFormData(Dictionary< string,> postParameters,string boundary) { Stream formDataStream = new System.IO.MemoryStream(); bool needsCLRF = false; foreach(postParameters中的var param) { //感谢评论者的反馈,添加CRLF以允许要添加多个参数。 //在第一个参数上跳过它,将其添加到后续参数中。 if(needsCLRF) formDataStream .Write(encoding.GetBytes(\\\\ n),0,encoding.GetByteCount(\\\\ n)); needsCLRF = true; if(param.Value is FileParameter) { FileParameter fileToUpload =(FileParameter )param.Value; //只添加此参数的第一部分,因为我们将文件数据直接写入Stream string header = string.Format( - {0} \\\\ nConContent-Disposition:form-data; name = \{1} \ ; filename = \{2} \; \\\Content-Type:{3} \\\\\\\ n, border, param.Key, fileToUpload.FileName ?? param.Key, fileToUpload.C​​ontentType ?? application / octet-stream); formDataStream.Write(encoding.GetBytes(header),0,encoding.GetByteCount(header)); //将文件数据直接写入Stream,而不是将其序列化为字符串。 formDataStream.Write(fileToUpload.File,0,fileToUpload .File.Length); } else { string postData = string.Format( - - {0} \\\\ nnContent-Disposition:form-data; name = \{1} \\\\\\ n {2}, 边界, param.Key, param.Value); formDataStream.Write(encoding.GetBytes(postData),0 ,encoding.GetByteCount(postData)); } } //添加结束请求。从换行符开始 string footer =\\\\ n - + boundary +--\\\\ n; formDataStream.Write (encoding.GetBytes(footer),0,encoding.GetByteCount(footer)); //将Stream转储成一个字节[] formDataStream.Position = 0; byte [] formData = new byte [formDataStream.Length]; formDataStream.Read(formData,0,formData.Length); formDataStream.Close(); 返回formData; } 公共类FileParameter { public byte [] File {get;组; } $ / $ 公共字符串FileName {get;组; } $ / $ 公共字符串ContentType {get;组; } $ / $ 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; } } 现在从aspx.cs页面调用..就像这样.. !! protected void btnUploadAsset_Click(object sender,EventArgs e) { //读取文件数据 string strPath = Server.MapPath(〜/ shopping / asset.png); FileStream fs = new FileStream(strPath,FileMode.Open,FileAccess.Read); byte [] data = new byte [fs.Length]; fs.Read(data,0,data.Length); fs.Close(); //生成帖子对象 Dictionary< string,> postParameters = new Dictionary< string,>(); postParameters.Add(token,txtToken.Text); // @ postParameters.Add(fileformat ,png); postParameters.Add(file,new SheerIdcl.FileParameter(data,asset.png,image / png)); //创建请求并收到回复 string postURL =services-sandbox.sheerid/rest/0.5/asset\"; 串的userAgent = Mozila; HttpWebResponse WebResponse类= SheerIdcl.MultipartFormDataPost(postURL,的userAgent,postParameters); //处理响应 的StreamReader responseReader =新的StreamReader(webResponse.GetResponseStream()); 串fullResponse = responseReader.ReadToEnd(); webResponse.Close(); ltrUploadResponse.Text = fullResponse; }

I am trying to upload image to restApi but it throws Internal server error. Please consider my code and guide me where i am missing something

public void UploadAsset(string sToken, string sImage) { string sRes = string.Empty; Uri address = new Uri("services-sandbox.sheerid/rest/0.5/asset"); // Create the web request HttpWebRequest oHttpWebRequest = WebRequest.Create(address) as HttpWebRequest; oHttpWebRequest.Credentials = new NetworkCredential("mrinalkumarjha", "******"); oHttpWebRequest.Headers["Authorization"] = "Bearer 624a3eef46f79772958693fa87118b29"; oHttpWebRequest.Method = "POST"; oHttpWebRequest.ContentType = "multipart/form-data"; // Create the data we want to send string sFile = "asset.png"; StringBuilder data = new StringBuilder(); data.Append("file=" + HttpUtility.UrlEncode(@sFile)); data.Append("&failure=" + HttpUtility.UrlEncode("Your URL")); data.Append("&succes=" + HttpUtility.UrlEncode("Your URL")); data.Append("&token=" + HttpUtility.UrlEncode(txtToken.Text)); // Create a byte array of the data we want to send byte[] byteData = UTF8Encoding.UTF8.GetBytes(data.ToString()); // Set the content length in the request headers oHttpWebRequest.ContentLength = byteData.Length; // Write data. using (Stream postStream = oHttpWebRequest.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); } // Get response using (HttpWebResponse response = oHttpWebRequest.GetResponse() as HttpWebResponse) { // Get the response stream StreamReader reader = new StreamReader(response.GetResponseStream()); // Console application output sRes = reader.ReadToEnd(); } }

[Edit]Code block added[/Edit]

解决方案

I have solved it .. add following in class file. private static readonly Encoding encoding = Encoding.UTF8; public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string,> 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; request.Credentials = new NetworkCredential("mrinalkumarjha", "*****"); request.Headers["Authorization"] = "Bearer 624a3eef46f79772958693fa87118b29"; // 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,> 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; } } Now call it from aspx.cs page.. Like this..!! protected void btnUploadAsset_Click(object sender, EventArgs e) { // Read file data string strPath = Server.MapPath("~/shopping/asset.png"); FileStream fs = new FileStream(strPath, FileMode.Open, FileAccess.Read); byte[] data = new byte[fs.Length]; fs.Read(data, 0, data.Length); fs.Close(); // Generate post objects Dictionary<string,> postParameters = new Dictionary<string,>(); postParameters.Add("token", txtToken.Text); //postParameters.Add("fileformat", "png"); postParameters.Add("file", new SheerIdcl.FileParameter(data, "asset.png", "image/png")); // Create request and receive response string postURL = "services-sandbox.sheerid/rest/0.5/asset"; string userAgent = "Mozila"; HttpWebResponse webResponse = SheerIdcl.MultipartFormDataPost(postURL, userAgent, postParameters); // Process response StreamReader responseReader = new StreamReader(webResponse.GetResponseStream()); string fullResponse = responseReader.ReadToEnd(); webResponse.Close(); ltrUploadResponse.Text = fullResponse; }

更多推荐

将图像上传到REST API的问题.. !!

本文发布于:2023-10-05 12:22:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1467367.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图像   REST   API

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!