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

相關文章
相關標籤/搜索