[转]WebApi 后端文件传输至远程服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | /* 功能说明:微信退款需要有数字证书,而我们公司是做小程序平台的,会帮商家自动退款,所以会要求商家把微信证书上传至我们服务器,以便 微信退款。 使用HttpPostedFile 接受前端上传的文件,再使用 */ #region 证书上传 UploadCertificate /// <summary> /// 证书上传 /// </summary> /// <returns></returns> [HttpPost] public IHttpActionResult UploadCertificate() { //此字段代表商家证书存储的文件夹 string enterpriseId = "test" ; OperationResult response = new OperationResult { Code = OperationResultType.IllegalOperation, Message = "不是有效的p12证书文件" }; try { HttpFileCollection filelist = HttpContext.Current.Request.Files; if (filelist != null && filelist.Count > 0) { HttpPostedFile file = filelist[0]; //文件名 string fileName = file.FileName; if ( string .IsNullOrWhiteSpace(fileName) || !fileName.Contains( "." )) { return Json(response); } var fileNameSplit = fileName.Trim( new [] { '"' }).Split( '.' ); //文件后缀名 string fileExName = fileNameSplit[fileNameSplit.Length - 1]; if (!fileExName.Equals( "p12" )) { return Json(response); } //上传文件至远程服务器 string res = PostResponse($ "url" , new HttpPostedFile[] { file }); if (! string .IsNullOrWhiteSpace(res)) { return Json(JsonUtility.DeserializeObject<OperationResult>(res)); } } } catch (Exception ex) { LogHelper.Error( "UploadCertificate-error" , ex); } return Json(response); } #endregion #region 使用WebRequest构建多媒体文件上传远程服务器 PostResponse /// <summary> /// 发起httpPost 请求,可以上传文件 /// </summary> /// <param name="url">请求的地址</param> /// <param name="files">文件</param> /// <returns></returns> public static string PostResponse( string url, HttpPostedFile[] files) { string boundary = "----------------------------" + DateTime.Now.Ticks.ToString( "x" ); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "multipart/form-data; boundary=" + boundary; request.Method = "POST" ; request.KeepAlive = true ; //request.Credentials = CredentialCache.DefaultCredentials; request.Expect = "" ; MemoryStream stream = new MemoryStream(); byte [] line = Encoding.ASCII.GetBytes( "--" + boundary + "\r\n" ); byte [] enterER = Encoding.ASCII.GetBytes( "\r\n" ); ////提交文件 if (files != null ) { string fformat = "Content-Disposition:form-data; name=\"file\";filename=\"{0}\"\r\nContent-Type:{1}\r\n\r\n" ; foreach (HttpPostedFile file in files) { //#region HttpPostedFile.InputStream=>byte[] //Stream inputStream = file.InputStream;//new MemoryStream(); //byte[] bytes = new byte[stream.Length]; //#endregion var fileStream = file.InputStream; var buffer = new byte [1024]; int bytesRead; // =0 stream.Write(line, 0, line.Length); //项目分隔符 string s = string .Format(fformat, file.FileName, file.ContentType); byte [] data = Encoding.UTF8.GetBytes(s); stream.Write(data, 0, data.Length); //stream.Write(bytes, 0, bytes.Length);//文件内容 while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { stream.Write(buffer, 0, bytesRead); } stream.Write(enterER, 0, enterER.Length); //添加\r\n } } byte [] foot_data = Encoding.UTF8.GetBytes( "--" + boundary + "--\r\n" ); //项目最后的分隔符字符串需要带上-- stream.Write(foot_data, 0, foot_data.Length); request.ContentLength = stream.Length; Stream requestStream = request.GetRequestStream(); //写入请求数据 stream.Position = 0L; stream.CopyTo(requestStream); // stream.Close(); requestStream.Close(); try { #region HttpWebResponse response = null ; try { response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { response = (HttpWebResponse)ex.Response; } #endregion //HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream streamIn = response.GetResponseStream(); StreamReader reader = new StreamReader(streamIn); string result = reader.ReadToEnd(); reader.Close(); streamIn.Close(); response.Close(); return result; } catch (Exception ex) { throw ex; } #endregion |
---------------------
作者:小小周
来源:CNBLOGS
原文:https://www.cnblogs.com/zlj-rechio/p/9953548.html
版权声明:本文为作者原创文章,转载请附上博文链接!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构