将图像上传到REST API的问题.. !! [英] Problem with uploading image to REST API..!!

查看:67
本文介绍了将图像上传到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.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 =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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆