.Net C#向远程服务器Api上传文件
时间:2020-04-13
本文章向大家介绍.Net C#向远程服务器Api上传文件,主要包括.Net C#向远程服务器Api上传文件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Api服务代码一:
/// <summary> /// 服务器接收接口 /// </summary> [HttpPost] [Route("ReceiveFile")] public HttpResponseMessage ReceiveFile() { string result = string.Empty; ArrayList list = new ArrayList(); try { Stream postStream = HttpContext.Current.Request.InputStream; byte[] b = new byte[postStream.Length]; string postFileName = DNTRequest.GetString("fileName"); if (string.IsNullOrEmpty(postFileName) && HttpContext.Current.Request["fileName"] != null) { postFileName = HttpContext.Current.Request["fileName"]; } string fileExtension = Path.GetExtension(postFileName); string dirName = "other"; if (!string.IsNullOrEmpty(fileExtension)) { dirName = fileExtension.Substring(fileExtension.LastIndexOf(".") + 1); } string dir = "/_temp/file/" + dirName + "/" + DateTime.Now.ToString("yyyyMMdd") + "/"; string fileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff"); fileName += fileExtension; string filePath = HttpContext.Current.Server.MapPath(dir); string saveFilePath = Path.Combine(filePath, fileName); string dirPath = dir + fileName; list.Add(dirPath); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } FileStream fs = new FileStream(saveFilePath, FileMode.Create); byte[] new_b = new byte[1024]; const int rbuffer = 1024; while (postStream.Read(new_b, 0, rbuffer) != 0) { fs.Write(new_b, 0, rbuffer); } postStream.Close(); fs.Close(); fs.Dispose(); if (list.Count > 0) { result = DNTRequest.GetResultJson(true, "success", string.Join(",", list.ToArray())); } } catch (Exception ex) { result = DNTRequest.GetResultJson(false, ex.Message, null); } HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(result, Encoding.GetEncoding("UTF-8"), "text/plain") }; return responseMessage; }
Api服务代码二:
[HttpPost] [Route("ReceiveFileTest")] public HttpResponseMessage ReceiveFileTest() { string result = string.Empty; var request = HttpContext.Current.Request; try { if (request.Files.Count > 0) { var fileNameList = new List<string>(); string dirName = "other"; foreach (string f in request.Files) { var file = request.Files[f]; string fileExtension = Path.GetExtension(file.FileName).ToLower(); string fileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff"); fileName += fileExtension; if (!string.IsNullOrEmpty(fileExtension)) { dirName = fileExtension.Substring(fileExtension.LastIndexOf(".") + 1); } string dir = "/_temp/file/" + dirName + "/" + DateTime.Now.ToString("yyyyMMdd") + "/"; string filePath = HttpContext.Current.Server.MapPath(dir); if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } string fileSavePath = Path.Combine(filePath, fileName); Stream postStream = file.InputStream; // FileStream fs = new FileStream(fileSavePath, FileMode.Create); byte[] new_b = new byte[1024]; const int rbuffer = 1024; while (postStream.Read(new_b, 0, rbuffer) != 0) { fs.Write(new_b, 0, rbuffer); } postStream.Close(); fs.Close(); fs.Dispose(); string dirPath = dir + fileName; fileNameList.Add(dirPath); fileNameList.Add(fileName); } result = DNTRequest.GetResultJson(true, string.Format("{0}:{1}", HttpStatusCode.OK, string.Join(",", fileNameList.ToArray())), null); } else { result = DNTRequest.GetResultJson(false, "请选择上传的文件", null); } } catch (Exception ex) { result = DNTRequest.GetResultJson(false, ex.Message, null); } HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(result, Encoding.GetEncoding("UTF-8"), "text/plain") }; return responseMessage; }
Ajax提交file代码,调用Api代码一的Script:
此方法后端Api代码一中始终获取不到文件名,所以我在Ajax的url中加了?fileName=fileObj.name,这样调试能走通。为什么Ajax提交时不能获取到文件名,我还在研究。
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
|
<script> $( "#inpSubmit" ).click( function () { //var fileObj = new FormData($("#importModel")[0]); var fileObj = document.getElementById( "inpFileControl" ).files[0]; if ( typeof (fileObj) == "undefined" || fileObj.size <= 0) { alert( "请选择文件" ); return ; } //console.log(fileObj); var formFile = new FormData(); formFile.append( "fileName" , fileObj.name); formFile.append( "file" , fileObj); //console.log(JSON.stringify(formFile)); //var paramters = {}; //paramters.timestamp = new Date().getTime(); //paramters.fileName = fileObj.name; //paramters.file = fileObj; //console.log(JSON.stringify(paramters)); $.ajax({ type: "post" , url: "http://localhost:19420/Api/ReceiveFile?fileName=" + fileObj.name, dataType: "json" , //contentType: false, processData: false , //用于对data参数进行序列化处理,默认值是true。默认情况下发送的数据将被转换为对象,如果不希望把File转换,需要设置为false cache: false , data: fileObj, success: function (json) { if (json.result) { $( "#inpFileUrl" ).val(json.data); console.log(json.data); } else { alert(json.msg); } }, error: function (ret) { console.log(ret.responseText); } }); return false ; }); </script> |
Ajax提交file代码,调用Api代码一的Html:
<form> <fieldset> <legend>Ajax提交到远程服务器Api</legend> <div class="form-group"> <label class="col-sm-2 control-label" for="ds_host">选择文件</label> <div class="col-sm-4"> <input class="form-control" id="inpFileUrl" name="inpFileUrl" type="text" placeholder="上传后返回地址" /> </div> <div class="col-sm-4"> <input type="file" id="inpFileControl" name="file" /> </div> <div class="col-sm-2"> <input id="inpSubmit" name="inpSubmit" type="button" value="提交" /> </div> </div> </fieldset> </form>
Form表单提交Post到远程Api代码二中,这个很顺利。下边是Html
<form action="http://localhost:19420/Api/ReceiveFileTest" method="post" enctype="multipart/form-data"> <fieldset> <legend>Form表单提交到远程服务器Api</legend> <div class="form-group"> <label class="col-sm-2 control-label" for="ds_host">选择文件</label> <div class="col-sm-4"> <input class="form-control" id="inpFileUrl2" name="inpFileUrl2" type="text" placeholder="上传后返回地址" /> </div> <div class="col-sm-4"> <input type="file" name="file" /> </div> <div class="col-sm-2"> <input type="submit" value="提交" /> </div> </div> </fieldset> </form>
Api服务部署时需要考虑到客户端提交file时有跨域问题,快捷方法是在IIS中设置Access-Control-Allow-Origin:*,但这样做有安全问题。
网站上传文件大小默认4M,所以网站配置文件中需要设置,如下:
<system.web> <httpRuntime maxRequestLength="409600" /> </system.web>
服务器IIS上传文件大小也有限制,也要做设置,如下:
<system.webServer> <security> <requestFiltering> <!--2G/2072576000|500M/518144000--> <requestLimits maxAllowedContentLength="518144000"/> </requestFiltering> </security> </system.webServer>
以上是我近2天的研究成果,不算完善还需要改进。
Api中使用了三方框架RestSharp,请在解决方案中找NuGet添加。
外部操作类用到的方法有,一:
/// <summary> /// 拼装JSON /// </summary> static public string GetResultJson(bool result, string msg, Object data) { string resultJson = string.Empty; Hashtable ht = new Hashtable(); try { ht.Add("result", result); ht.Add("msg", msg); ht.Add("data", data); } catch (Exception ex) { ht.Add("result", false); ht.Add("msg", ex.Message); } resultJson = Newtonsoft.Json.JsonConvert.SerializeObject(ht); return resultJson; }
注意:Html代码中file控件需要有name=“file”属性,否则提交后Api获取不到file对象,如下。
<input type="file" name="file" />
第三种方法是form表单提交调用mvc的control,control在调用Api代码二,这个测试失败,能上传文件,但上传的文件不能打开是损坏的,正在想办法解决。
下边是第三种方法的Html代码:
<form action="/Test/UploadFileTest" method="post" enctype="multipart/form-data"> <fieldset> <legend>Form表单提交到本地Control</legend> <div class="form-group"> <label class="col-sm-2 control-label" for="ds_host">选择文件</label> <div class="col-sm-4"> <input class="form-control" id="inpFileUrl3" name="inpFileUrl3" type="text" placeholder="上传后返回地址" /> </div> <div class="col-sm-4"> <input type="file" name="file" /> </div> <div class="col-sm-2"> <input type="submit" value="提交" /> </div> </div> </fieldset> </form>
下边是第三种方法的Control代码:
[HttpPost] public ActionResult UploadFileTest() { string result = string.Empty; string apiUrl = "http://localhost:19420/Api/ReceiveFileTest"; string contentType = "application/octet-stream"; var files = new List<string>(); foreach (string f in Request.Files) { var file = Request.Files[f]; var request = new RestRequest(Method.POST); request.AlwaysMultipartFormData = true; //request.AddParameter("fileName", file.FileName); Stream postStream = file.InputStream; byte[] b = new byte[postStream.Length]; request.AddFile("file", b, file.FileName, contentType); var restClient = new RestClient { BaseUrl = new Uri(apiUrl) }; string res = string.Empty; IRestResponse<Object> response = restClient.Execute<Object>(request); if (response.StatusCode == HttpStatusCode.OK) { res = response.Content; } else { res = string.Format("{0}:{1}", response.StatusCode, response.Content); } files.Add(res); } if (files.Count > 0) { result = string.Join(",", files.ToArray()); } return Json(result); }
原文地址:https://www.cnblogs.com/zoujinhua/p/12692011.html
- 比特币项目
- HDU 1014 Uniform Generator【GCD,水】
- 【AlphaGo Zero 核心技术-深度强化学习教程代码实战05】SARSA(λ)算法实现
- 区块链应用场景:物联网和物流供应链
- HDU 1012 u Calculate e【暴力打表,水】
- Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】
- HDU 1013 Digital Roots【字符串,水】
- Gym 100952I&&2015 HIAST Collegiate Programming Contest I. Mancala【模拟】
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
- Gym 100952E&&2015 HIAST Collegiate Programming Contest E. Arrange Teams【DFS+剪枝】
- Gym 100952H&&2015 HIAST Collegiate Programming Contest H. Special Palindrome【dp预处理+矩阵快速幂/打表解法】
- Gym 100952G&&2015 HIAST Collegiate Programming Contest G. The jar of divisors【简单博弈】
- Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+
- Gym 100952D&&2015 HIAST Collegiate Programming Contest D. Time to go back【杨辉三角预处理,组合数,dp】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP观察者模式实例分析【对比JS观察者模式】
- PHP实现图片压缩
- Python库安装速度过慢解决方案
- PHP按一定比例压缩图片的方法
- PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
- django restframework serializer 增加自定义字段操作
- 深入理解 PHP7 中全新的 zval 容器和引用计数机制
- python中可以声明变量类型吗
- keras中的History对象用法
- php session_decode函数用法讲解
- 解决python对齐错误的方法
- 详解pyinstaller生成exe的闪退问题解决方案
- PHP递归算法的简单实例
- Yii2框架操作数据库的方法分析【以mysql为例】
- 使用OpenCV实现道路车辆计数的使用方法