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