.net mvc web api上传图片/文件并重命名

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

// 检查是不是 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 ide

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

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;ui

}
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();url


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

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

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

<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">

相关文章
相关标签/搜索