webapi 上傳圖片


需求:上傳學員信息時同時上傳頭像信息,學員基本信息表和科目表為一對多關系表(添加基本信息后添加通過科目信息)。
 
測試:
        [HttpPost]
        public string Post()
        {
            if (!Request.Content.IsMimeMultipartContent())
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "Invalid Request!"));

            //獲取學員信息
            Student model = new Student()
            {
                Name = HttpContext.Current.Request.Form["StuName"],
                GroupName = HttpContext.Current.Request.Form["GroupName"],
                // ...
            };
            //獲取學員通過科目名稱
            string passSubject = HttpContext.Current.Request.Form["passSubject"];
            //獲取學員未通過科目名稱
            string noPassSubject = HttpContext.Current.Request.Form["noPassSubject"];

            Trace.WriteLine("begin 添加學員信息");
            //添加學員信息
            stuService.AddStuByAsync(model).ContinueWith(p =>
            {
                long stuId = p.Result;
                Trace.WriteLine("begin 通過科目表");
                subjectService.AddPassSubject(passSubject, stuId);//添加此學員通過科目信息
                Trace.WriteLine("end 通過科目表");

                Trace.WriteLine("begin 未通過科目表");
                subjectService.AddPassSubject(noPassSubject, stuId);//添加此學員未通過科目信息
                Trace.WriteLine("end 未通過科目表");

            });
            Trace.WriteLine("end 添加學員信息");

            string path = System.Web.HttpContext.Current.Server.MapPath("~/Images/upload/");
            Trace.WriteLine("獲取圖片......");
            Request.Content.ReadAsMultipartAsync().ContinueWith(p =>
           {
               var content = p.Result.Contents;
               Trace.WriteLine("begin 圖片");
               foreach (var item in content)
               {
                   
                   if (string.IsNullOrEmpty(item.Headers.ContentDisposition.FileName))
                   {
                       continue;
                   }  
                   item.ReadAsStreamAsync().ContinueWith(a =>
                 {
                     Stream stream = a.Result;
                     string fileName = item.Headers.ContentDisposition.FileName;
                     fileName = fileName.Substring(1, fileName.Length - 2);

                     Trace.WriteLine("圖片名稱:"+fileName);

                     //stream 轉為 image
                     saveImg(path, stream, fileName);
                 });
               }
               Trace.WriteLine("end 圖片");
           });
            return "ok";
        }

 

表單測試:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form enctype="multipart/form-data" method="post" action="http://localhost:17822/api/Student/Post">
        <p><label>學員名稱:</label> <input name="StuName" /></p>
 
        <p><label>分組名稱</label><input name="GroupName" /></p>

        <p><label>通過科目:</label>  <input name="passSubject" /></p>

        <p><label>未通過科目:</label>  <input name="noPassSubject" /></p>

        <p><label>頭像</label> <input type="file" name="dfile" /></p>

        <p><label></label>   <input type="submit" /></p>
    </form>
</body>
</html>

提交后結果如下:

通過輸出 "圖片名稱” 在 "end 圖片" 下可以看出,圖片在上傳時主線程已經繼續向下執行了

上部分也是同樣,在方法 AddStuByAsync() 執行完的時候啟動子線程去添加科目信息。

 


免責聲明!

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



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