CSharp - 在 C# 中,无法使用 web request上传图像

  显示原文与译文双语对照的内容

我正在尝试通过API以编程方式将映像上载到另一个服务器。 API要求我在一个字节 array 中上传图像,以便在一个字段中发送: image_content"。

我的实现和调用代码如下所示。 web请求命中服务器,但服务器响应该映像不在我的网页请求中。

运行下面的代码时,出现错误,说明图像没有出现在请求中。 我在这里missing什么?


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.ContentLength = formData.Length;



//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)


 { 


 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}rnContent-Disposition: form-data; name="{1}"; filename="{2}"rnContent-Type: {3}rnrn",


 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}rnContent-Disposition: form-data; name="{1}"rnrn{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 ="rn--" + boundary +"--rn";


 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;


 }


}



}

要调用上面的函数的代码是:


//Read file data


FileStream fs = new FileStream("c:myimage.jpeg", 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("image_content",data);



//Create request and receive response


string postURL ="myurl";


string userAgent ="Mozilla";


HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postURL, userAgent, postParameters);



//Process response


StreamReader responseReader = new StreamReader(webResponse.GetResponseStream());


string fullResponse = responseReader.ReadToEnd();


webResponse.Close();


Response.Write(fullResponse);



时间: 原作者:

我认为,你应该使用 MultipartFormDataContent 类,因为它是"为使用多部分/表单数据MIME类型编码的内容提供容器。"的。 试试这个


 public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, byte[] data)


 {


 string contentType;


 byte[] formData = Program.GetMultipartFormData(data, out contentType); 


 return PostForm(postUrl, userAgent, contentType, formData);


 }



 public static byte[] GetMultipartFormData(byte[] data, out string contentType)


 {


 var byteArrayContent = new ByteArrayContent(data);


 byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");


 byteArrayContent.Headers.Add("image_content","myimage.jpeg");



 var content = new MultipartFormDataContent(String.Format("----------{0:N}", Guid.NewGuid())) { byteArrayContent };


 contentType = content.Headers.ContentType.ToString();



 return content.ReadAsByteArrayAsync().Result;


 }



原作者:

通过使用JSON请求和 RestSharp,通过 C# 问题上传文件中提到的RestSharp Api来解决这个问题。

原作者:
...