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部分 ...
随机推荐
- Spring Web常见面试问题
一.Web容器初始化过程 先初始化listener,然后是filter,然后是servlet. 二.Spring MVC项目中IOC容器关系 Web容器启动时通知ContextLoaderListen ...
- 写了个自动生成vcxproj的程序
背景: 公司的vcxproj有个模板,必须要遵守 程序测试 config = { { ProjName = 'my_exe', ClCompile = {'main.cpp', 'main2.cpp' ...
- Window离线环境下如何安装pyhanlp
Hanlp在离线环境下的安装我是没有尝试过的,分享SunJW_2017的这篇文章就是关于如何在离线环境下安装hanlp的.我们可以一起来学习一下! HanLP是一款优秀的中文自然语言处理工具,可以实现 ...
- 命令:jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
命令:jstack(查看线程).jmap(查看内存)和jstat(性能分析)命令 这些命令 必须 在 linux jdk bin 路径 下执行 eq: ./jstack 10303 即可 如果想把 ...
- [转帖][分享] 关于系统DIY--by 原罪
http://wuyou.net/forum.php?mod=viewthread&tid=399277&extra=page%3D1 前几天我发了一个帖子<Windows组件w ...
- 纯CSS制作图形效果
下面所有的例子都是在demo.html的基础上添加相关样式实现的. <!DOCTYPE html> <html> <head> <meta charset=& ...
- C++Primer第五版——习题答案详解(二)
习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第3章 字符串.向量和数组 练习3.2 一次读入一整行 #include<iost ...
- flutter学习地址
Flutter - 不一样的跨平台解决方案: 关于Flutter,你想知道的都在这里了!: Flutter 时间表 2015 年 4 月,Flutter(最初代号 Sky)在 Dart Devel ...
- mybatis 注解形式设置批量新增、批量更新数据
1. 批量更新: @Update({"<script>" + "<foreach collection=\"smsConfigTemplate ...
- Oracle 学习笔记(六)
Oracle 数据库常用的闪回sql 语句及其它操作语句: --Oracle 数据库dml sql -- 查看当前用户所拥有的表 select * from tab; --表空间,auto: 自动管理 ...