.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(".") + );
}
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上传文件的更多相关文章
- 返璞归真 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 上传文件, ...
- 演示如何通过 web api 上传文件MVC40
演示如何通过 web api 上传文件WebApiWebFormHost/UploadFileController.cs /* * 通过 web api 上传文件 */ using System; u ...
- php 下 html5 XHR2 + FormData + File API 上传文件
FormData的作用: FormData对象可以帮助我们自动的打包表单数据,通过XMLHttpRequest的send()方法来提交表单.当然FormData也可以动态的append数据.FormD ...
- C# Web Api 上传文件
一. 使用默认方法上传文件: 1.Action: /// <summary> /// 上传文件 使用上传后的默认文件名称 /// 默认名称是BodyPart_XXXXXX,BodyPart ...
- 从Linux服务器下载上传文件
首先要确定好哪两种的连接:Linux常用的有centors和unbantu两种版本,PC端Mac和Windows 如果在两个Linux之间传输,或Linux和Mac之间传输可以使用scp命令,类似于s ...
- 1.5 WEB API 上传文件
1.前提,设置跨域 2.在控制器头添加允许跨域 /// <summary> /// 文件管理口控制器 /// </summary> [EnableCors("*&qu ...
- HttpClient 测试web API上传文件实例
1.使用HttpClient 测试上传文件并且设置header信息: using Lemon.Common; using Newtonsoft.Json; using System; using Sy ...
- 前端AngularJS后端ASP.NET Web API上传文件
本篇体验使用AngularJS向后端ASP.NET API控制器上传文件. 首先服务端: public class FilesController : ApiController { //usi ...
- 使用root用户登录到AWS EC2服务器,上传文件到/var/www目录
关键词 1.aws ec2中上传文件到/var/www目录(使用filezilla) 2.使用root用户登录aws ec2实例 上一篇随笔中记录了在aws ec2实例中部署apache服务器的过程, ...
随机推荐
- 序列化 json和pickle
序列化 1. 什么叫序列化 将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 2. json dumps loads 一般对字典和列表序列化 dump load 一般对 ...
- 关于int *a; int &a;a; int &a; *a; int * &a
int i; int*a =&i;//这里a是一个指针,它指向变量i int&b = i;//这里b是一个引用,它是变量i的引用,引用是什么?它的本质是什么?下面会具体讲述 int*& ...
- PHP性能调优,PHP慢日志---善用php-fpm的慢执行日志slow log,分析php性能问题
众所周知,MySQL有slow query log,根据慢查询日志,我们可以知道那些sql语句有性能问题.作为mysql的好搭档,php也有这样的功能.如果你使用php-fpm来管理php的话,你可以 ...
- N皇后问题的实现
N皇后问题是一个经典的问题,是回溯算法的典型案例.它是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的八皇后问题延伸而来的,具体要求如下:在N*N的方格棋盘放置N个皇后,使她们彼此不相互攻击,即任意2 ...
- VS 2015 序列号/密钥/企业版/专业版
专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV
- MySQL下concat函数中null值问题
在mysql中,使用CONCAT(str1,str2,...)函数拼接字符串的过程中,如果你拼接的字段当中有值为null,那么拼接的结果就为null 注: select CONCAT(字段1,字段2) ...
- 005 Ajax中使用jquery实现三种格式的信息
1.jquery中的ajax 二:load 2.load方法 3.load测试程序大纲 4.load测试程序 <!DOCTYPE html> <html> <head&g ...
- PostgreSQL 入门
1.连接数设置为:-1.表示链接数不受限制,理论上可以使用无数个链接. 2.使用外键约束,外键用来在两个表的数据之间建立连接,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的 ...
- 基于Laravel开发博客应用系列 —— 构建博客后台管理系统
一个完整的博客应用不能没有后台管理系统.所以在本节中我们将继续完善博客应用 —— 开发后台管理系统. 1.创建路由 在上一节十分钟创建博客项目中,已经设置过了 app/Http/routes.php, ...
- liniux Crontab 的重启和设置
重启crontab,service cron restart 05 01 * * * /usr/local/php/bin/php FILE 10,30,50 * * * * /usr/local/p ...