WebApi上传文件
上网搜了下Web Api上传文件的功能,发现都写的好麻烦,就自己写了一个,比较简单,直接上传文件就可以,可以用Postman测试。
简单的举例
/// <summary>
/// 超级简单的文件上传
/// </summary>
public class EasyUploadFileController : ApiController
{
/// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
[HttpPost]
public string PostWithFile()
{
UploadWithFile(HttpContext.Current.Request);
return "文件上传成功";
} /// <summary>
/// 上传文件
/// </summary>
/// <param name="request"></param>
private void UploadWithFile(HttpRequest request)
{
for (int i = ; i < request.Files.Count; i++)
{
var file = request.Files[i];
if (file.ContentLength <= ) continue;
var ext = new FileInfo(file.FileName).Extension;
var fullPath = Path.Combine(@"G:\Image", Path.GetFileName(Guid.NewGuid() + ext));
file.SaveAs(fullPath);
}
} }
结果
复杂举例带参数
public class UploadFileController : ApiController
{
/// <summary>
/// 8M
/// </summary>
public const int MAX_LENGTH = * * ;
public const int MIN_WIDTH = ;
public const int MIN_HEIGHR = ; /// <summary>
/// 上传文件
/// </summary>
/// <returns></returns>
[HttpPost]
public string PostWithFile()
{
JObject jObject = GetParam(HttpContext.Current.Request);
ParamModel model = GetParamModel(jObject); Tuple<bool, string> upload = UploadWithFile(HttpContext.Current.Request);
return upload.Item2 + " 参数:" + JsonConvert.SerializeObject(model);
} /// <summary>
/// 上传文件
/// </summary>
/// <param name="request"></param>
private Tuple<bool, string> UploadWithFile(HttpRequest request)
{
bool success = true;
string message = string.Empty;
for (int i = ; i < request.Files.Count; i++)
{
var file = request.Files[i];
if (file.ContentLength <= ) continue; #region check的代码
if (!FitFileLength(file))
{
message = message + file.FileName + "文件大小不能超过8M;";
continue;
} if (!FitImageSize(file))
{
message = message + file.FileName + "图片长宽分别不能小于600像素;";
continue;
}
#endregion var ext = new FileInfo(file.FileName).Extension;
var fullPath = Path.Combine(@"G:\Image", Path.GetFileName(Guid.NewGuid() + ext));
file.SaveAs(fullPath);
} if (string.IsNullOrEmpty(message))
{
message = "上传成功";
}
Tuple<bool, string> result = new Tuple<bool, string>(success, message);
return result;
} /// <summary>
/// 符合文件大小
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
private bool FitFileLength(HttpPostedFile file)
{
bool result = true;
if (file.ContentLength >= MAX_LENGTH)
{
result = false;
}
return result;
} /// <summary>
/// 符合图片尺寸
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
private bool FitImageSize(HttpPostedFile file)
{
bool result = true;
var ext = new FileInfo(file.FileName).Extension;
if (IsImage(ext))
{
Image image = Image.FromStream(file.InputStream);
if (image.Height <= MIN_HEIGHR || image.Width <= MIN_WIDTH)
{
result = false;
}
} return result;
} /// <summary>
/// 监测是否是图片
/// </summary>
/// <param name="ext"></param>
/// <returns></returns>
public bool IsImage(string ext)
{
bool result = false;
switch (ext.ToLower())
{
case (".jpg"):
case (".png"):
case (".gif"):
case (".bmp"):
result = true;
break;
default:
result = false;
break;
}
return result;
} /// <summary>
/// 获得参数
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
private JObject GetParam(HttpRequest request)
{
JObject jObject = new JObject();
foreach (string key in request.Form)
{
jObject[key] = request.Form[key];
}
return jObject;
} /// <summary>
/// 简单的Model转换
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
private ParamModel GetParamModel(JObject jObject)
{
ParamModel model = new ParamModel();
model.Param1 = jObject["Param1"] != null ? jObject["Param1"].ToString() : "";
model.Param2 = jObject["Param2"] != null ? jObject["Param2"].ToString() : "";
model.Param3 = jObject["Param3"] != null ? jObject["Param3"].ToString() : ""; return model;
}
}
Html测试
<div class="jumbotron">
<form action="/UploadFile/PostWithFile" method="post" enctype="multipart/form-data" class="form-horizontal">
<div class="form-group">
<label for="Param1" class="col-xs-2">Param1</label>
<input type="text" class="form-control col-xs-8" name="Param1" placeholder="Param1">
</div>
<div class="form-group">
<label for="Param2" class="col-xs-2">Param2</label>
<input type="text" class="form-control" name="Param2" placeholder="Param2">
</div>
<div class="form-group">
<label for="Param3" class="col-xs-2">Param3</label>
<input type="text" class="form-control" name="Param3" placeholder="Param3">
</div>
<div class="form-group">
<label for="exampleInputFile" class="col-xs-2">File input</label>
<input type="file" name="f1" />
<input type="file" name="f2" />
<input type="file" name="f3" />
</div>
<button type="submit" class="btn btn-default">上传图片</button>
</form>
</div>
源码
https://github.com/jasonhua95/WebApiUploadFile.git
WebApi上传文件的更多相关文章
- Owin WebAPI上传文件
Owin是微软出了几年的东东了,一直没时间学习.大概了解了下,是一个脱离IIS环境,快速搭建WebAPI服务的东西. 刚好想尝试下尽量脱离IIS创建简单快捷配置的项目,就是用了Nginx+Owin的模 ...
- Asp.Net Core WebApi 和Asp.Net WebApi上传文件
public class UpLoadController : ControllerBase { private readonly IHostingEnvironment _hostingEnviro ...
- webAPI 上传文件 404错误(转载)
webAPI文件上传时文件过大404错误的问题 来源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有个需求,外网希望自动保存数据 ...
- .Net Core2.2 WebApi上传文件
基于.net core2.2的webapi程序,接收客户端上传的文件.按照以下写法,file的值永远是null [HttpPost] public void Post([FromForm] IForm ...
- C# WebApi 上传文件
本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...
- (转)WebApi 上传文件
本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...
- 使用swagger上传文件
经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息:swagger也能通过接口的参数列表,自动获得发送的数据结构信息. 不过有一个例外,就是上传文件的时 ...
- webApi上传下载文件
上传文件通过webApi html端调用时包含(form提交包含 enctype="multipart/form-data",才可以启作用获取到文件) public class U ...
- WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)
简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...
随机推荐
- _Bool and bool
_Bool is the defined before C99. bool has been defined in C99. bool is an alias for _Bool if you inc ...
- visio画图有感
昨天在和一个同事看流程图,在我还在考虑图的含义时他说这个图太乱了,如果要团队成员看也会很费劲,并找出觉得画的好的案例. 对比两个图我发现了一个最大的差别是好的图形状都是水平或垂直对齐的,连接线也都是水 ...
- TCP/IP详解--TCP连接中TIME_WAIT状态过多
TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的.仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT.服务器在处理客户端请 ...
- async+await一起使用
/** get 请求 * @param {接口地址} url * @param {请求参数} params */ get(url,params){ return new Promise((resolv ...
- JVM之堆内存(年经代,老年代)
一.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- C#操作IIS程序池及站点的创建配置(转)
原文:http://www.cnblogs.com/wujy/archive/2013/02/28/2937667.html 最近在做一个WEB程序的安装包:对一些操作IIS进行一个简单的总结:主 ...
- Calendar打印日历
package com.example.demo; import org.junit.Test; import org.junit.runner.RunWith; import org.springf ...
- Music Recommendation System with User-based and Item-based Collaborative Filtering Technique(使用基于用户及基于物品的协同过滤技术的音乐推荐系统)【更新】
摘要: 大数据催生了互联网,电子商务,也导致了信息过载.信息过载的问题可以由推荐系统来解决.推荐系统可以提供选择新产品(电影,音乐等)的建议.这篇论文介绍了一个音乐推荐系统,它会根据用户的历史行为和口 ...
- setDaemon 守护线程
setDaemon(True): 将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起.这个方法基本和join是相反的. 当我们 在程序运行中,执行一个 ...
- 阿里云ODPS <====>蚂蚁大数据
1.命令行客户端工具的安装参考文档:http://repo.aliyun.com/odpscmd/?spm=a2c4g.11186623.2.17.5c185c23zHshCq 2.创建和查看表:ht ...