将图像上传到REST API的问题.. !! [英] Problem with uploading image to REST API..!!
问题描述
我正在尝试将图片上传到restApi,但它会引发内部服务器错误。
请考虑我的代码并指导我在哪里找不到的东西
public void UploadAsset( string sToken, string sImage)
{
string sRes = string .Empty;
Uri地址= new Uri( https://services-sandbox.sheerid.com/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;
// 创建我们要发送的数据
< span class =code-keyword> 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)
{
< span class =code-comment> // 获取响应流
StreamReader reader = new StreamReader(response.GetResponseStream());
// 控制台应用程序输出
sRes = reader.ReadToEnd ();
}
}
已添加代码块[/ Edit]
< blockquote> 我已经解决了..在类文件中添加以下内容。
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.ContentType ?? 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 =https://services-sandbox.sheerid.com/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("https://services-sandbox.sheerid.com/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 = "https://services-sandbox.sheerid.com/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的问题.. !!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!