看了很多前輩的內容,大概有兩種寫法,
1.用 MultipartFileData 類
接收文件后,會自動保存,名命方式是BodyPart_xxxxxx,沒有后綴名的一個文件
想要按照自己的名命方式存的話,需要再加一步重命名的操作,
刪除同理。
#方法1.
1 // POST api/<controller> Task<IHttpActionResult> 2 [HttpPost] 3 public async Task<IHttpActionResult> Post(int id = 0) 4 { 5 Log.WriteLog("文件上傳接口信息處理開始", CommConst.LOG_NORMAL, pageId); 6 7 #region 返回用類 8 // 返回用 9 fileUploadResult fResult = new fileUploadResult(); 10 #endregion 11 12 // Check if the request contains multipart/form-data. 13 // 檢查該請求是否含有multipart/form-data 14 if (!Request.Content.IsMimeMultipartContent()) 15 { 16 fResult.errCode = ResultConst.UPLOAD_FAILURE_CODE; 17 fResult.message = "存在multipart/form-data!"; 18 fResult.status = ResultConst.UPLOAD_FAILURE_STATUS; 19 throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 20 } 21 22 try 23 { 24 #region 方法1.自動保存.使用中 25 //可以用這個返回之后的鍵值對-此處有返回類故廢棄不用 26 //Dictionary<string, string> dic = new Dictionary<string, string>(); 27 //指定要將文件存入的服務器物理位置 28 string root = HttpContext.Current.Server.MapPath("~/App_Data"); 29 var provider = new MultipartFormDataStreamProvider(root); 30 31 // Read the form data. 32 // 讀取表單數據 33 await Request.Content.ReadAsMultipartAsync(provider); 34 35 if (Checker.IsNotEmpty(provider.FileData)) 36 { 37 fResult.errCode = ResultConst.UPLOAD_SUCCESS_CODE; 38 39 // This illustrates how to get the file names. 40 // 以下描述如何獲取文件名 41 foreach (MultipartFileData file in provider.FileData) 42 { 43 //接收文件-自動保存 44 //獲取上傳文件實際的文件名 45 Trace.WriteLine(file.Headers.ContentDisposition.FileName); 46 //獲取上傳文件在服務上默認的文件名 47 Trace.WriteLine("Server file path: " + file.LocalFileName); 48 49 //重命名文件名 50 string newFileName = file.Headers.ContentDisposition.FileName; 51 newFileName = newFileName.Trim('"'); 52 newFileName = newFileName.Split('\\')[newFileName.Split('\\').Length - 1]; 53 newFileName = DateTime.Now.ToString("yyyyMMddHHss") + newFileName; 54 string newFilePathName = root + "\\" + newFileName; 55 56 //文件重命名-刪除自動生成的文件-File.Delete(file.LocalFileName); 57 Directory.Move(file.LocalFileName, newFilePathName); 58 59 //設置文件名 60 fResult.SetMatsterDataFileName(newFileName); 61 62 //TODO 外部接口調用,返回url 63 fResult.SetMatsterDataSmallIconUrl("example"); 64 } 65 } 66 else 67 { 68 fResult.errCode = ResultConst.UPLOAD_FAILURE_CODE; 69 fResult.status = ResultConst.UPLOAD_FAILURE_STATUS; 70 fResult.message = "無文件信息!"; 71 } 72 73 //// 顯示所有“鍵-值”對 74 //foreach (var key in provider.FormData.AllKeys) 75 //{ 76 // //接收FormData 77 // //dic.Add(key, provider.FormData[key]); 78 //} 79 #endregion 80 } 81 catch (Exception e) 82 { 83 Log.WriteLog("文件上傳接口信息處理異常,異常信息:" + e.ToString(), e, CommConst.LOG_ERROR, pageId); 84 fResult.errCode = ResultConst.UPLOAD_FAILURE_CODE; 85 if (Checker.IsEmpty(fResult.message)) 86 { 87 //失敗原因 88 fResult.message = e.ToString(); 89 } 90 fResult.status = ResultConst.UPLOAD_FAILURE_STATUS; 91 } 92 finally 93 { 94 Log.WriteLog("文件上傳接口信息處理結束", CommConst.LOG_NORMAL, pageId); 95 } 96 return Json(fResult); 97 }
2.使用 HttpContext.Current.Request.Files
異步時可能存在問題,所以我並沒有使用這個
這個方法可以根據實際需求選擇存/不存文件,
也可以根據實際需求名命文件。
#方法2.
1 // POST api/<controller> Task<IHttpActionResult> 2 [HttpPost] 3 public async Task<IHttpActionResult> Post(int id = 0) 4 { 5 Log.WriteLog("文件上傳接口信息處理開始", CommConst.LOG_NORMAL, pageId); 6 7 #region 返回用類 8 // 返回用 9 fileUploadResult fResult = new fileUploadResult(); 10 #endregion 11 12 // Check if the request contains multipart/form-data. 13 // 檢查該請求是否含有multipart/form-data 14 if (!Request.Content.IsMimeMultipartContent()) 15 { 16 fResult.errCode = ResultConst.UPLOAD_FAILURE_CODE; 17 fResult.message = "存在multipart/form-data!"; 18 fResult.status = ResultConst.UPLOAD_FAILURE_STATUS; 19 throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 20 } 21 22 try 23 { 24 #region 方法2.手動保存.已注釋 25 //獲取文件 26 HttpFileCollection files = HttpContext.Current.Request.Files; 27 28 //判斷文件是否存在 29 if (Checker.IsNotEmpty(files)) 30 { 31 //解析文件 32 foreach (string key in files.AllKeys) 33 { 34 HttpPostedFile file = files[key];//file.ContentLength文件長度 35 if (string.IsNullOrEmpty(file.FileName) == false) 36 { 37 //重命名文件名 38 string newFileName = DateTime.Now.ToString("yyyyMMddhhss") + "-" + file.FileName; 39 //保存+重命名文件 40 file.SaveAs(HttpContext.Current.Server.MapPath("~/App_Data/") + newFileName); 41 //設置文件名 42 fResult.SetMatsterDataFileName(newFileName); 43 44 //外部接口調用,返回url 45 fResult.SetMatsterDataSmallIconUrl("example"); 46 } 47 } 48 } 49 else 50 { 51 fResult.errCode = ResultConst.UPLOAD_FAILURE_CODE; 52 fResult.status = ResultConst.UPLOAD_FAILURE_STATUS; 53 fResult.message = "無文件信息!"; 54 } 55 #endregion 56 } 57 catch (Exception e) 58 { 59 Log.WriteLog("文件上傳接口信息處理異常,異常信息:" + e.ToString(), e, CommConst.LOG_ERROR, pageId); 60 fResult.errCode = ResultConst.UPLOAD_FAILURE_CODE; 61 if (Checker.IsEmpty(fResult.message)) 62 { 63 //失敗原因 64 fResult.message = e.ToString(); 65 } 66 fResult.status = ResultConst.UPLOAD_FAILURE_STATUS; 67 } 68 finally 69 { 70 Log.WriteLog("文件上傳接口信息處理結束", CommConst.LOG_NORMAL, pageId); 71 } 72 return Json(fResult); 73 }
3.最后附上使用的類和引用
使用類的名命空間省略了
引用並非全部需要,根據實際使用情況再刪減
#返回類
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace xxxx//省略 7 { 8 /// <summary> 9 /// 文件接口調用結果 10 /// </summary> 11 public class fileUploadResult 12 { 13 /// <summary> 14 /// 狀態碼:0-成功 15 /// </summary> 16 public string errCode 17 { 18 get; 19 set; 20 } 21 22 /// <summary> 23 /// 狀態描述:0-成功 24 /// </summary> 25 public string message 26 { 27 get; 28 set; 29 } 30 31 /// <summary> 32 /// 狀態描述:0-success 33 /// </summary> 34 public string status 35 { 36 get; 37 set; 38 } 39 40 /// <summary> 41 /// 文件信息 42 /// </summary> 43 public class ms 44 { 45 public string fileName 46 { 47 get; 48 set; 49 } 50 public string smallIconUrl 51 { 52 get; 53 set; 54 } 55 } 56 57 58 /// <summary> 59 /// 設置文件信息 60 /// </summary> 61 public ms masterData = new ms(); 62 63 /// <summary> 64 /// 設置fileName 65 /// </summary> 66 /// <param name="fileName"></param> 67 public void SetMatsterDataFileName(string fileName) 68 { 69 masterData.fileName = fileName; 70 } 71 72 /// <summary> 73 /// 設置url 74 /// </summary> 75 /// <param name="url"></param> 76 public void SetMatsterDataSmallIconUrl(string url) 77 { 78 masterData.smallIconUrl = url; 79 } 80 } 81 }
#引用
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.Linq; 5 using System.Net; 6 using System.Net.Http; 7 using System.Threading.Tasks; 8 using System.Web; 9 using System.Web.Http; 10 using System.Web.Http.Results; 11 using System.IO;