C# multipart/form-data提交文件和参数
public static string PostJsonData(string url, Dictionarydic, string imgfile) { string str = ""; try { HttpClient client = new HttpClient(); var postContent = new MultipartFormDataContent(); string boundary = string.Format("--{0}", DateTime.Now.Ticks.ToString("x")); postContent.Headers.Add("ContentType", $"multipart/form-data, boundary={boundary}"); string image_file_Type="faceImage"; postContent.Add(new ByteArrayContent(File.ReadAllBytes(imgfile)), image_file_Type, imgfile); foreach (var key in dic.Keys) { postContent.Add(new StringContent(dic[key].ToString()), key); } HttpResponseMessage response = client.PostAsync(url, postContent).Result; str = response.Content.ReadAsStringAsync().Result; } catch (Exception ex) { Log.Print("PostJsonData:" + ex.ToString()); } return str; }
C# POST multipart/form-data案例
using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; using XingcOpen.ILS.Business.Interface; using XingcOpen.ILS.Core.Model; using XingcOpen.ILS.Core.Log; using XingcOpen.ILS.Business.Config.Module; using XingcOpen.ILS.Business.Config; using System.Threading; using System.IO; using Newtonsoft.Json.Linq; using System.Net.Http.Headers; using Newtonsoft.Json; using System.Windows.Forms; namespace XingcOpen.ILS.Business.ExpressSystemApi.Client { ////// 韩国图片上报接口 /// class HanGuoLogisticsPic : ISendPackageInfo { public bool CheckProcessHasRun() { throw new NotImplementedException(); } UserConfigInfo config = UserConfigHelper.GetInstance().userConfig; private static object _loc = new object(); private Thread DSuPicUpload; public bool CheckTicketNumHasEffective(string ticketsNum) { throw new NotImplementedException(); } public CommonResult GeneralSendTicketsNumAndPackageWeight(TicketInfo info) { throw new NotImplementedException(); } public bool SendTicketsNumAndPackageWeight(string barcode, double weight, double length, double width, double height, double volume) { //定义图片绝对路径 //var ListImage = config.PicSavePath + @"\" + DateTime.Now.ToString("yyyyMMdd") + @"\" + barcode + ".jpg"; try { 图片上传 DSuPicUpload = new Thread(() => UploadPic(barcode)); DSuPicUpload.Start(); return true; } catch (Exception ex) { Logger.Error("线程启动异常," + ex.Message); return false; } } public T SendTicketsNumAndPackageWeight (Dictionary packageDic) { throw new NotImplementedException(); } #region 图片上报接口 private void UploadPic(string barcode) { while (true) { if (config.IsSavePic == 1) { //上传图片 DoLocalImgUpload(Path.Combine(config.PicSavePath, DateTime.Now.ToString("yyyyMMdd")), barcode); DoLocalImgUpload(Path.Combine(config.PicSavePath, DateTime.Now.AddDays(-1).ToString("yyyyMMdd")), barcode); } Thread.Sleep(3000); } } public void DoLocalImgUpload(string picFilepath, string barcode) { try { if (Directory.Exists(picFilepath)) { DirectoryInfo directoryInfo = new DirectoryInfo(picFilepath); //取图片文件夹下的1分钟之前的图片的前5张(按创建时间排序) //防止文件被占用 lock (_loc) { var topfiles = directoryInfo.EnumerateFiles(). Where(p => p.CreationTime <= DateTime.Now.AddMinutes(-1)). OrderBy(f => f.CreationTime). Take(5).ToList(); // topfiles.Distinct(); topfiles.OrderByDescending(x => x.FullName).Distinct(); if (topfiles.Count > 0) { //循环执行上传 foreach (var fileInfo in topfiles) // for (var i = 0; i < topfiles.Count; i++) { Logger .Debug("topfiles.count:" + topfiles.Count + " fileInfo:" + fileInfo.FullName); UploadLocalByName(fileInfo.FullName, barcode); //topfiles.Remove(fileInfo); } topfiles.Clear(); Thread.Sleep(1000); Logger .Debug("图片上传线程循环上传中!"); } } } } catch (Exception ex) { Logger .Error(".图片文件上传发生异常!", ex); } } public void UploadLocalByName(string picFilepath, string barcode) { string url = @"http://www.kwaiden.com/SendPackageInfo/ApiPhoto_I.asp"; try { Logger .Debug("picFilepath:" + picFilepath); if (File.Exists(picFilepath)) { int pos = picFilepath.LastIndexOf("\\"); string name = picFilepath.Substring(pos + 1); string nums = name.Replace(".jpg", ""); //string userPhoto = string.Empty; //byte[] bytes = File.ReadAllBytes(picFilepath); //userPhoto = Convert.ToBase64String(bytes); //userPhoto = userPhoto.Replace("+", "%2B"); if (UploadImages(nums, name, picFilepath, url, barcode)) { //上传完是否需要删除? File.Delete(picFilepath); } } } catch (Exception ex) { Logger .Error(".图片文件上传发生异常!", ex); } } public bool UploadImages(string code, string name, string picFilepath, string url, string barcode) { try { string result = SendData(picFilepath, name, url, barcode, null, null); var i = JObject.Parse(result); if (i["result"].ToString().Trim() == "true") { //播放声音文件 string strPath = Path.Combine(Application.StartupPath, @"config\sound") + "\\" + "Right.wav"; if (File.Exists(strPath)) { System.Media.SoundPlayer sndPlayer2 = new System.Media.SoundPlayer(strPath); sndPlayer2.Play(); } else { Logger .Error("PlaySoundSendSuccess。 不存在声音文件:" + strPath); } return true; } else { //播放声音文件 string strPath = Path.Combine(Application.StartupPath, @"config\sound") + "\\" + "Wrong.wav"; if (File.Exists(strPath)) { System.Media.SoundPlayer sndPlayer2 = new System.Media.SoundPlayer(strPath); sndPlayer2.Play(); } else { Logger .Error("PlaySoundSendSuccess。 不存在声音文件:" + strPath); } return false; } } catch (Exception e) { Logger .Error("上传图片异常 " + e); } return false; } public string SendData(string picFilepath, string name, string url, string barcode, string workConsole, string destination) { var fileContent1 = new ByteArrayContent(File.ReadAllBytes(picFilepath)); fileContent1.Headers.ContentDisposition = new ContentDispositionHeaderValue("file") { FileName = name }; var postContent = new MultipartFormDataContent(); postContent.Add(new StringContent(barcode), "ticketsNum"); postContent.Add(fileContent1);//图片文件 postContent.Add(new StringContent(workConsole), "workConsole"); postContent.Add(new StringContent(destination), "destination"); Logger .Debug("向"+config.HttpPostApiAddr+"发送数据"+JsonConvert.SerializeObject(postContent)); string httpResult = GetHttpPostResponse(url, postContent); Logger .Debug("接收" + config.HttpPostApiAddr + "返回数据" + httpResult); return httpResult; } private string GetHttpPostResponse(string url, MultipartFormDataContent postData) { string result = ""; //form表单格式传参 try { HttpClient client = new HttpClient(); HttpResponseMessage response = client.PostAsync(url, postData).Result; result = response.Content.ReadAsStringAsync().Result; } catch (Exception ex) { result = ex.Message; } Logger .Debug($"HanGuoLogistics 返回数据:{result}"); return result; } /// /// 参数上报 /// public class ImageInfo { public string ticketsNum { get; set; } public string file { get; set; } public string workConsole { get; set; } public string destination { get; set; } } ////// 返回信息 /// public class ImageResult { public bool result { get; set; } public string message { get; set; } } #endregion } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。