利用multipart/form-data实现图片的上传与接收

1.图片上传至控制器,本过程有:构建http请求,发送参数以及图片信息

代码为:

#region 存储图片
			//开启http访问链接
			using (HttpClient client = new HttpClient())
			{
				//设定要响应的数据格式
				client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/json"));
				//定义内容
				using (var content = new MultipartFormDataContent())
				{
					//基于字节数组提供http内容
					List listPara = new List();
					//请求头部
					var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(saveurl));
					dataContent.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
					{
						Name = "ImgPath"
					};
					listPara.Add(dataContent);
					//请求数据
					List listData = new List();
					Stream stream = file.InputStream;
					byte[] bytes = new byte[stream.Length];
					stream.Read(bytes, 0, bytes.Length);
					stream.Seek(0, SeekOrigin.Begin);

					//数据部分
					ByteArrayContent fileContemt = new ByteArrayContent(bytes);
					//定义文件名
					fileContemt.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
					{
						FileName = fileNameNew
					};
					listData.Add(fileContemt);
					//申明一个方法 将ByteArrayContent集合加入到MulipartFormDataContent中
					Action> act = (dataContents) =>
					{
						foreach (var item in dataContents)
						{
							content.Add(item);
						}
					};
					act(listPara);
					act(listData);
					//发送请求
					var requestResult = client.PostAsync(GlobalData.ImgOperSite + "/api/ImgUpload/UploadImage", content).Result;
					if (requestResult.StatusCode == System.Net.HttpStatusCode.OK)
					{
						//取得保存图片返回的状态结果
						string resultStr = requestResult.Content.ReadAsStringAsync().Result;
						ImageOperateResult ImageModel = JsonHelper.ToObj(resultStr);
						if (ImageModel != null)
						{
							//成功
							if (ImageModel.Success == true)
							{
								//路径为相对路径+文件名
								imgModel.ImagePath = Tools.GetReadImg(saveurl) + fileNameNew;
								imgModel.UpdateTime = DateTime.Now;
								imgModel.DisplayStartTime = imgModel.DisplayStartTime == DateTime.MinValue ? DateTime.Now : imgModel.DisplayStartTime;
								imgModel.DisplayEndTime = imgModel.DisplayEndTime == DateTime.MinValue ? DateTime.MaxValue : imgModel.DisplayEndTime;
							}
							//失败
							else
							{
								return Json(new { type = Info.error, msg = ImageModel.Msg }, JsonRequestBehavior.AllowGet);
							}
						}
						else
						{
							return Json(new { type = Info.warning, msg = "没有获取服务器返回的数据" }, JsonRequestBehavior.AllowGet);
						}
					}
					else
					{
						return Json(new { type = Info.warning, msg = "发送请求失败" }, JsonRequestBehavior.AllowGet);
					}
				}
			}
			#endregion

2.利用webapi进行图片接收并处理

 [RoutePrefix("api/ImgUpload")]
    public class ImgUploadController : ApiController
    {
               
        [HttpPost, Route("UploadImage")]     
        public async Task UploadImage()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Error, "上传图片失败:不支持的媒体类型(Unsupported media type)!");
                return new ImageOperateResult { Success = false, Error = "", Msg = "不支持的媒体类型(Unsupported media type)!" };
            }        
            string root = HttpContext.Current.Server.MapPath("~/App_Data");//指定要将文件存入的服务器物理位置  
            if (!Directory.Exists(root))
            {
                Directory.CreateDirectory(root);
            }

            var provider = new MultipartFormDataStreamProvider(root);
            string ImgPath="";
            try
            {
                await Request.Content.ReadAsMultipartAsync(provider);

                ImgPath = Convert.ToString(provider.FormData["ImgPath"]);
                if(ImgPath==null)
                    LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Info, "上传图片ImgPath参数为空");
                else
                     LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Info, string.Format("上传图片ImgPath参数:{0}", ImgPath));              
                if (!Directory.Exists(fullfilepath))
                {
                    Directory.CreateDirectory(fullfilepath);
                }


                bool fileFaild = false;
                string msgException = "";

                List listFile = new List();

                foreach (var file in provider.FileData)
                {
                    string orfilename = file.Headers.ContentDisposition.FileName.TrimStart('"').TrimEnd('"');
                    LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Info, string.Format("orfilename:{0}", orfilename));
                    FileInfo fileinfo = new FileInfo(file.LocalFileName);
                    LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Info, string.Format("上传图片:{0}", file.LocalFileName));
                    if (fileinfo.Length <= 0)
                    {
                        fileFaild = true;
                        msgException = "上传的图片为空!";

                    }
                    else
                    {
                        int idxDot = orfilename.LastIndexOf('.');
                        if (idxDot > 0)
                        {                            
                            fileinfo.CopyTo(Path.Combine(fullfilepath, orfilename), true);
                        }
                    }
                    fileinfo.Delete();//删除原文件
                    if (fileFaild) break;
                }
                if (fileFaild)
                {
                    LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Error, string.Format("上传图片失败:{0}", msgException));
                    return new ImageOperateResult { Success = false, Error = "", Msg = msgException }; ;
                }
                return new ImageOperateResult { Success = true, Error = "", Msg = "上传图片成功!" };
            }
            catch (Exception ex)
            {
                LibraryLogger.Instance.WriteLog(LibraryLogger.libLogLevel.Error, string.Format("上传图片异常:{0}", ex.Message));
                return new ImageOperateResult { Success = false, Error = ex.ToString(), Msg = "上传图片异常!" };
            }
       
        }
    }

你可能感兴趣的:(ASP.NET,C#,webapi)