C#/.NET-WebApi上傳文件.后台


看了很多前輩的內容,大概有兩種寫法,

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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM