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(".") + );
}
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[];
const int rbuffer = ; while (postStream.Read(new_b, , rbuffer) != )
{
fs.Write(new_b, , rbuffer);
}
postStream.Close();
fs.Close();
fs.Dispose(); if (list.Count > )
{
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 > )
{
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(".") + );
}
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[];
const int rbuffer = ; while (postStream.Read(new_b, , rbuffer) != )
{
fs.Write(new_b, , 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提交时不能获取到文件名,我还在研究。

<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="" />
</system.web>

服务器IIS上传文件大小也有限制,也要做设置,如下:

  <system.webServer>
<security>
<requestFiltering>
<!--2G/|500M/-->
<requestLimits maxAllowedContentLength=""/>
</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 > ) {
result = string.Join(",", files.ToArray());
} return Json(result);
}

.Net C#向远程服务器Api上传文件的更多相关文章

  1. 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作

    原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...

  2. 演示如何通过 web api 上传文件MVC40

    演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...

  3. php 下 html5 XHR2 + FormData + File API 上传文件

    FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...

  4. C# Web Api 上传文件

    一. 使用默认方法上传文件: 1.Action: /// <summary> /// 上传文件 使用上传后的默认文件名称 /// 默认名称是BodyPart_XXXXXX,BodyPart ...

  5. 从Linux服务器下载上传文件

    首先要确定好哪两种的连接:Linux常用的有centors和unbantu两种版本,PC端Mac和Windows 如果在两个Linux之间传输,或Linux和Mac之间传输可以使用scp命令,类似于s ...

  6. 1.5 WEB API 上传文件

    1.前提,设置跨域 2.在控制器头添加允许跨域 /// <summary> /// 文件管理口控制器 /// </summary> [EnableCors("*&qu ...

  7. HttpClient 测试web API上传文件实例

    1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...

  8. 前端AngularJS后端ASP.NET Web API上传文件

    本篇体验使用AngularJS向后端ASP.NET API控制器上传文件.    首先服务端: public class FilesController : ApiController { //usi ...

  9. 使用root用户登录到AWS EC2服务器,上传文件到/var/www目录

    关键词 1.aws ec2中上传文件到/var/www目录(使用filezilla) 2.使用root用户登录aws ec2实例 上一篇随笔中记录了在aws ec2实例中部署apache服务器的过程, ...

随机推荐

  1. How to detect whether socket is still connected...

    How to detect whether socket is still connected… */--> div.org-src-container { font-size: 85%; fo ...

  2. javascript数组元素的添加、删除与插入以及参数数组的使用

    1.数组元素的添加 push方法在数组的尾部添加元素: var colorArray=new Array(); colorArray.push('red','black','yellow'); //这 ...

  3. python类、类继承

    yield: 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab( ...

  4. 关于Fuzz——peach的学习

    最近在搞漏洞挖掘,之前写过一个文件格式漏洞挖掘的博文,使用的是光刃牛写的Alpha Fuzz工具.感觉样本生成的质量不是很好,这次打算使用一下老牌的Fuzz工具peach.学长介绍了一下说peach的 ...

  5. MIT6.006Lec03:插入排序,归并排序,递归树

    MIT6.006是算法导论课,Lec03主要讲插入排序,归并排序,以及分析方法(递归树)等. 插入排序,可以分为线性插入排序.二分插入排序,区别在于当把数组中某元素插入到前面的有序列表中时,前者遍历, ...

  6. Mybatis入门及Dao开发方式

    本节内容: Mybatis介绍 使用jdbc编程问题总结 Mybatis架构 Mybatis入门程序 Dao的开发方式 SqlMapConfig.xml文件说明 一.Mybatis介绍 MyBatis ...

  7. USACO 5.5 Twofive

    TwofiveIOI 2001 In order to teach her young calvess the order of the letters in the alphabet, Bessie ...

  8. thinkphp中I()方法的详解

    I('post.email','','email'); int boolean float validate_regexp validate_url validate_email validate_i ...

  9. ArrayList源码中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别

    2018年7月22日09:54:17 JDK 1.8.0_162 ArrayList源码中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别 ...

  10. [leetcode shell]194. Transpose File

    Given a text file file.txt, transpose its content. You may assume that each row has the same number ...