编程语言
首页 > 编程语言> > C#/.NET-WebApi上传文件.后台

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                         //文件重命名
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;

 

标签:WebApi,文件,string,C#,System,UPLOAD,using,NET,fResult
来源: https://www.cnblogs.com/sjy-ly/p/14119670.html