使用C#和WebRequest上传图像?

这是Python中的工作代码(使用cURL):

#!/usr/bin/python import pycurl c = pycurl.Curl() values = [ ("key", "YOUR_API_KEY"), ("image", (c.FORM_FILE, "file.png"))] # OR: ("image", "http://example.com/example.jpg"))] # OR: ("image", "BASE64_ENCODED_STRING"))] c.setopt(c.URL, "http://imgur.com/api/upload.xml") c.setopt(c.HTTPPOST, values) c.perform() c.close() 

这是我在C#中所拥有的:

 public void UploadImage() { //I think this line is doing something wrong. //byte[] x = File.ReadAllBytes(@"C:\Users\Sergio\documents\visual studio 2010\Projects\WpfApplication1\WpfApplication1\Test\hotness2.jpg"); //If I do it like this, using a direct URL everything works fine. string parameters = @"key=1b9189df79bf3f8dff2125c22834210903&image=http://sofzh.miximages.com/c%23/reddit.com.header.png"; //Convert.ToBase64String(x); WebRequest webRequest = WebRequest.Create(new Uri("http://imgur.com/api/upload")); webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes(parameters); Stream os = null; try { // send the Post webRequest.ContentLength = bytes.Length; //Count bytes to send os = webRequest.GetRequestStream(); os.Write(bytes, 0, bytes.Length); //Send it } catch (WebException ex) { MessageBox.Show(ex.Message, "HttpPost: Request error"); } finally { if (os != null) { os.Close(); } } try { // get the response WebResponse webResponse = webRequest.GetResponse(); StreamReader sr = new StreamReader(webResponse.GetResponseStream()); MessageBox.Show(sr.ReadToEnd().Trim()); } catch (WebException ex) { MessageBox.Show(ex.Message, "HttpPost: Response error"); } } 

现在,我注意到的事情是,当我将参数字符串中的API密钥更改为“239231”或任何数字时,我得到的响应是:“无效的API密钥。” 所以我觉得有些事情必须正常。

我放置了正确的 API密钥,现在我得到了不同的响应:“图片格式无效。请尝试上传JPEG图片。”

我正在使用的服务几乎接受所有图像格式,所以我100%肯定错误是我发送文件的方式。 任何人都能解释一下吗?

编辑!!!

事实certificate,当我上传JPG图像时,我得到了那个灰盒子的东西。 如果我上传一个大的jpg图像我什么都没得到。 例如: http : //i.imgur.com/gFsUY.jpg

当我上传PNG时,上传的图片甚至都没有显示。

我确定问题是编码。 我能做什么?

编辑2 !!!

现在我100%确定问题出在方法的第一行。 File.ReadAllBytes()必须做错了。 如果我上传一个URL文件,每个工作都很好: http : //imgur.com/sVH61.png

我想知道我应该使用什么编码。 :S

试试这个:

 string file = @"C:\Users\Sergio\documents\visual studio 2010\Projects\WpfApplication1\WpfApplication1\Test\Avatar.png"; string parameters = @"key=1df918979bf3f8dff2125c22834210903&image=" + Convert.ToBase64String(File.ReadAllBytes(file)); 

您应该正确地形成一个多部分POST请求。 在此处查看示例: 使用HTTPWebrequest上传文件(multipart / form-data)

阅读API发布的图片

 public IHttpActionResult UpdatePhysicianImage(HttpRequestMessage request) { try { var form = HttpContext.Current.Request.Form; var model = JsonConvert.DeserializeObject(form["json"].ToString()); bool istoken = _appdevice.GettokenID(model.DeviceId); if (!istoken) { statuscode = 0; message = ErrorMessage.TockenNotvalid; goto invalidtoken; } HttpResponseMessage result = null; var httpRequest = HttpContext.Current.Request; if (httpRequest.Files.Count > 0) { var docfiles = new List(); foreach (string file in httpRequest.Files) { var postedFile = httpRequest.Files[file]; // var filePath = uploadPath + postedFile.FileName; // string fileUrl = Utility.AbsolutePath("~/Data/User/" + model.UserId.ToString()); string fileUrl = Utility.AbsolutePath("~/" + Utility.UserDataFolder(model.UserId, "Document")); if (!Directory.Exists(fileUrl)) { Directory.CreateDirectory(fileUrl); Directory.CreateDirectory(fileUrl + "\\" + "Document"); Directory.CreateDirectory(fileUrl + "\\" + "License"); Directory.CreateDirectory(fileUrl + "\\" + "Profile"); } string imageUrl = postedFile.FileName; string naviPath = Utility.ProfileImagePath(model.UserId, imageUrl); var path = Utility.AbsolutePath("~/" + naviPath); postedFile.SaveAs(path); docfiles.Add(path); if (model.RoleId == 2) { var doctorEntity = _doctorProfile.GetNameVideoChat(model.UserId); doctorEntity.ProfileImagePath = naviPath; _doctorProfile.UpdateDoctorUpdProfile(doctorEntity); } else { var patientEntity = _PatientProfile.GetPatientByUserProfileId(model.UserId); patientEntity.TumbImagePath = naviPath; _PatientProfile.UpdatePatient(patientEntity); } } result = Request.CreateResponse(HttpStatusCode.Created, docfiles); } else { result = Request.CreateResponse(HttpStatusCode.BadRequest); } } catch (Exception e) { statuscode = 0; message = "Error" + e.Message; } invalidtoken: return Json(modeldata.GetData(statuscode, message)); } 

尝试改变: –

 "application/x-www-form-urlencoded" 

 "multipart/form-data" 

尝试将jpg的内容类型添加到您的多部分边界。

请参阅此uRL以获取示例(最后)

http://sofzh.miximages.com/c%23/forms.html“); Stream stm = new Stream(); System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality; System.Drawing.Imaging.EncoderParameters paramz = new System.Drawing.Imaging.EncoderParameters(1); myEncoderParameter = new EncoderParameter(myEncoder, 100L); paramz.Param[0] = myEncoderParameter; i.Save(stm, System.Drawing.Imaging.ImageFormat.Jpeg, paramz); /* I’m lazy: code for reading Stream into byte[] here */