#region 上传图片
/// <summary>
/// 上传图片到服务器 当error为0时成功,为1时失败 并从errmsg获取消息
/// </summary>
/// <returns></returns>
public Task<Hashtable> post()
{
String PhoneId = null;

// 检查是否是 multipart/form-data
if (!Request.Content.IsMimeMultipartContent("form-data"))
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
//文件保存目录路径
//string SaveTempPath = "~/App_Data/";
//System.String dirTempPath = HttpContext.Current.Server.MapPath(SaveTempPath);
System.String dirTempPath = @"C:\picture";
// 设置上传目录
var provider = new MultipartFormDataStreamProvider(dirTempPath);
//var queryp = Request.GetQueryNameValuePairs();//获得查询字符串的键值集合

//接受数据并保存文件
var task = Request.Content.ReadAsMultipartAsync(provider).
ContinueWith<System.Collections.Hashtable>(o =>
{
Hashtable hash = new Hashtable();

hash["error"] = 1;
hash["errmsg"] = "上传出错";
var file = provider.FileData[0];//provider.FormData

string orfilename = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');
FileInfo fileinfo = new FileInfo(file.LocalFileName);
//判断拿到的PhoneId
PhoneId = provider.FormData["PhoneId"];

if (string.IsNullOrEmpty(PhoneId.Trim()) || PhoneId.Trim().Length == 0)
{
hash["error"] = 1;
hash["errmsg"] = "未上传PhoneId";
fileinfo.Delete(); //如果不写这句你会发现 返回的数据是正常的 但文件依旧会Down下来
return hash;
}
//最大文件大小
int maxSize = 10000000;
if (fileinfo.Length <= 0)
{
hash["error"] = 1;
hash["errmsg"] = "请选择上传文件。";
fileinfo.Delete();
return hash;
}
else if (fileinfo.Length > maxSize)
{
hash["error"] = 1;
hash["errmsg"] = "上传文件大小超过限制。";
fileinfo.Delete();
return hash;
}
else
{
string fileExt = orfilename.Substring(orfilename.LastIndexOf('.'));
//定义允许上传的文件扩展名
String fileTypes = "gif,jpg,jpeg,png,bmp";
if (String.IsNullOrEmpty(fileExt) || Array.IndexOf(fileTypes.Split(','), fileExt.Substring(1).ToLower()) == -1)
{
hash["error"] = 1;
hash["errmsg"] = "上传文件扩展名是不允许的扩展名。";
fileinfo.Delete();
return hash;
}
else
{
string path = @"picture\" + PhoneId + ".jpg";
try
{
if (modelusers.updatePicture(PhoneId, path) != 1)
{
hash["error"] = 1;
hash["errmsg"] = "更新数据库失败";
fileinfo.Delete();
return hash;
}

}
catch (Exception ex)
{
hash["error"] = 1;
hash["errmsg"] = "更新数据库失败2";
fileinfo.Delete();
return hash;

}
String ymd = DateTime.Now.ToString("yyyyMMdd", System.Globalization.DateTimeFormatInfo.InvariantInfo);
//String newFileName = DateTime.Now.ToString("yyyyMMddHHmmss_ffff", System.Globalization.DateTimeFormatInfo.InvariantInfo);
String newFileName = PhoneId;
fileinfo.CopyTo(Path.Combine(dirTempPath, newFileName + fileExt), true);
fileinfo.Delete();

hash["error"] = 0;
hash["errmsg"] = "上传成功";
}
}
return hash;
});

return task;
}
#endregion
值得注意的几点:
- 当上传成功时,error值为0。失败时,error为1并从errmsg中获取失败消息。
- 在文件路径处偷了个懒直接把文件的路径塞上去了,如果是从当前路径下放文件的话,请遵循注释。
- PhoneId = provider.FormData[“PhoneId”];这句拿到你应该上传的文件名,根据你的需求修改
- 如果不进行重新命名的话,文件会有默认命名值,并且没有后缀名。这是因为MVC4.0 WebAPI上传后的图片默认以字符串bodypart结合Guid来命名,且没有文件后缀
- fileinfo.Delete();如果不写这句你会发现 返回的数据是失败的 但文件依旧会Down下来 这是因为文件在一开始执行的时候就已经保存下来了,所以在失败后你应该将他删除。

接下来是我自己写的简单测试代码,各位再写完接口时要自己多测试测试,塞一些异常数据进去,看看是否能够正常运行,不要等到后期出问题了再反过头去修改。

<html>

<form action="这里写接口url" method="post" enctype="multipart/form-data">

<input type="file" name="file">

<hr>
<input type="text" name="PhoneId" id="PhoneId">
<hr>
<input type="submit" value="submit" id="btnPutUserInfo">

</form>
</html>
---------------------
作者:Morning-Wind
来源:CSDN
原文:https://blog.csdn.net/zch501157081/article/details/51540854
版权声明:本文为博主原创文章,转载请附上博文链接!

.net mvc web api上传图片/文件并重命名的更多相关文章

  1. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  2. ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...

  3. Web API与文件操作

    前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在 ...

  4. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

  5. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  6. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

  7. ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

    问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...

  8. ASP.NET MVC Web API For APP

    近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScr ...

  9. .net mvc web api 返回 json 内容,过滤值为null的属性

    原文:http://blog.csdn.net/xxj_jing/article/details/49508557 版权声明:本文为博主原创文章,未经博主允许不得转载. .net mvc web ap ...

随机推荐

  1. 树莓派4B的CPU系统里查到为BCM2835而非BCM2711

    树莓派4B采用四核64位的ARM Cortex-A72架构CPU,型号为博通BCM2711 SoC.2711是个64位的四核,而2835是多年前的32位单核CPU. 查看当前芯片版本,显示为4核心,但 ...

  2. 洛谷P3513 [POI2011]KON-Conspiracy

    洛谷P3513 [POI2011]KON-Conspiracy 题目描述 Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动. 国王需要选一些人来进行这场运动,而这些人被分为 ...

  3. 计算vtable的大小

    在ClassFileParser::parseClassFile()函数中会计算vtable和itable所需要的大小,因为vtable和itable是内嵌在Klass中的,parseClassFil ...

  4. C#算法设计排序篇之05-归并排序(附带动画演示程序)

    归并排序(Merge Sort) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/683 访问. 归并排序是建立在归并操作 ...

  5. 静态代理和动态代理(jdk/cglib)详解

    1.静态代理模式 代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色.其中:Subject角色负责定义RealSubject和Proxy角色应该实现的接口:RealSu ...

  6. [netty4][netty-buffer]netty之池化buffer

    PooledByteBufAllocator buffer分配 buffer分配的入口: io.netty.buffer.PooledByteBufAllocator.newDirectBuffer( ...

  7. STL函数库的应用第四弹——全排列(+浅谈骗分策略)

    因为基础算法快学完了,图论又太难(我太蒻了),想慢慢学. 所以暂时不写关于算法的博客了,但又因为更新博客的需要,会多写写关于STL的博客. (毕竟STL函数库还是很香的(手动滑稽)) 请出今天主角:S ...

  8. vue watch 和 computed 区别与使用

    目录 computed 和 watch 的说明 与 区别 computed 计算属性说明: watch 监听属性说明: watch 和 computed 的区别是: 使用 参考官方文档 compute ...

  9. Centos7查看端口占用

    (1)netstat -lnp|grep 50090 如果提示没有netstat命令,可需要安装:yum -y install net-tools (2) lsof -i:50090 参考链接:lin ...

  10. Today At AntDock 2020年8月21日

    前段时间,我在 Mac 上使用 CLion 进行 C++ 编译,但发现 #include<bits/stdc++.h> 居然出了问题,无法使用,Xcode 也不行.我试图查找资料,但一般都 ...