上网搜了下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上传文件的更多相关文章

  1. Owin WebAPI上传文件

    Owin是微软出了几年的东东了,一直没时间学习.大概了解了下,是一个脱离IIS环境,快速搭建WebAPI服务的东西. 刚好想尝试下尽量脱离IIS创建简单快捷配置的项目,就是用了Nginx+Owin的模 ...

  2. Asp.Net Core WebApi 和Asp.Net WebApi上传文件

    public class UpLoadController : ControllerBase { private readonly IHostingEnvironment _hostingEnviro ...

  3. webAPI 上传文件 404错误(转载)

    webAPI文件上传时文件过大404错误的问题  来源:https://www.cnblogs.com/dzhengyang/p/9149157.html 背景:最近公司有个需求,外网希望自动保存数据 ...

  4. .Net Core2.2 WebApi上传文件

    基于.net core2.2的webapi程序,接收客户端上传的文件.按照以下写法,file的值永远是null [HttpPost] public void Post([FromForm] IForm ...

  5. C# WebApi 上传文件

    本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...

  6. (转)WebApi 上传文件

    本文转载自:http://www.cnblogs.com/zj1111184556/p/3494502.html public class FileUploadController : ApiCont ...

  7. 使用swagger上传文件

    经常使用swagger,可以通过设置[ProducesResponseType]标记接口的返回信息:swagger也能通过接口的参数列表,自动获得发送的数据结构信息. 不过有一个例外,就是上传文件的时 ...

  8. webApi上传下载文件

    上传文件通过webApi html端调用时包含(form提交包含 enctype="multipart/form-data",才可以启作用获取到文件) public class U ...

  9. WebAPI通过multipart/form-data方式同时上传文件以及数据(含HttpClient上传Demo)

    简单的Demo,用于了解WebAPI如何同时接收文件及数据,同时提供HttpClient模拟如何同时上传文件和数据的Demo,下面是HttpClient上传的Demo界面 1.HttpClient部分 ...

随机推荐

  1. keepalived自动安装脚本

    #!/bin/bash tar xf keepalived-1.1.17.tar.gz cd keepalived-1.1.17 yum -y install openssl-* kernel-dev ...

  2. 第三章 jQuery总结 参考文本

    jQuery jQuery是javascript的一个函数库,非常方便,非常主流 利用jQuery开发步骤: 1导入jQuery库 2在$(function(){})的{}中编写jQuery代码 ①j ...

  3. 对Array.prototype.slice.call()方法的理解

    在看别人代码时,发现有这么个写法:[].slice.call(arguments, 0),这到底是什么意思呢? 1.基础 1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规 ...

  4. 黄聪:iOS $299刀企业证书申请的过程以及细节补充

    最近申请了iOS的 299刀企业证书,相关过程有些问题,分享出来,以便后来人参考.申请的过程我主要参考了别人以前的文章,链接如下: 1.https://developer.apple.com/cn/s ...

  5. 注解:大话AOP与Android的爱恨情仇

    转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...

  6. .net 连接 Oracle 可能需要配置

    D:\Program Files (x86)\Oracle Developer Tools for VS2013\network\admin\tnsnames.ora

  7. PO & SO Integration By IDOC in CNABB

    PO & SO Integration By IDOC in CNABB 话说博主来ABB一个多月时间了,虽然对ABB系统内的流程和配置不是很了解,但对ABB系统内使用的PO和SO通过idoc ...

  8. Python-实列

    """题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再 ...

  9. rabbitmq (一)用法

    首先,主机一是window系统,虚拟机二 ubuntu, ubuntu部署了rabbitmq服务端.默认监听5672端口. 由于rabbitmq内部有严格的权限系统,使用之前必须配置好权限. 默认网页 ...

  10. python3对excel文件读写操作

    ===========================excelfile文件============================================ ================= ...