本篇對之前的設計做一下擴展,實現F8功能(見紅色部分),客戶端可以通過調用此接口API上傳一張(或多張)自己的照片。
功能序號 | HTTP謂詞(HTTP verbs) | API | 描述 |
F1 | GET | /api/users |
管理員獲取用戶列表 |
F2 | POST | /api/users |
管理員添加用戶 |
F3 | PATCH | /api/users/{id}/role | 管理員修改用戶角色 |
F4 | PATCH | /api/users/{id}/state | 管理員鎖定/解鎖用戶 |
F5 | GET | /api/users/{id} | 用戶獲取自己的信息 |
F6 | PUT | /api/users/{id} | 用戶更新自己的信息 |
F7 | PATCH | /api/users/{id} |
用戶修改密碼 |
F8 | POST |
|
用戶上傳自己的圖片 |
一、准備工作:
1. 在項目的根目錄下新增 Images 的文件夾用來存放上傳的圖片,如下:
2. 添加如下3個引用
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using System.IO;
3. 在UsersController.cs的構造函數中注入環境實例以便獲取應用程序目錄,代碼如下(紅色部分):
1 private IWebHostEnvironment _env; 2 private ILogger<UsersController> _logger; 3 private IUserDao _userDao; 4 public UsersController(IWebHostEnvironment env, ILogger<UsersController> logger, IUserDao userDao) 5 { 6 _env = env; 7 _logger = logger; 8 _userDao = userDao; 9 }
二、終結點編碼
新增終結點 UploadPhoto( ),路由屬性為 [Route("{id}/photo")] ,代碼如下:
1 [Route("{id}/photo")] 2 [HttpPost] 3 public ContentResult UploadPhoto(int id) 4 { 5 //圖片保存路徑 6 string filePath = _env.ContentRootPath + "\\Images\\"; 7 8 string fullName = string.Empty; 9 10 //Request.Form.Files獲取客戶端POST過來的所有文件 11 IFormFileCollection files = Request.Form.Files; 12 foreach (FormFile file in files) //遍歷處理每一個文件 13 { 14 //Path.GetExtension()獲取文件擴展名 15 string exten = Path.GetExtension(file.FileName).ToLower(); 16 17 //擴展名不符合要求就不處理 18 if (exten != ".jpg" && exten != ".png") continue; 19 20 //Guid.NewGuid().ToString()生成一個GUID風格的文件名避免重名 21 string fileName = Guid.NewGuid().ToString(); 22 23 fullName = filePath + fileName + exten; 24 25 //用using語句釋放文件資源 26 using (FileStream stream = new FileStream(fullName, FileMode.Create, FileAccess.Write)) 27 { 28 file.CopyTo(stream); 29 stream.Flush(); 30 } 31 32 } 33 return Content("{'result':'ok'}"); 34 }
三、測試
打開POSTMAN運行網址 http://localhost:52384/api/users/1/photo,添加兩個圖片文件后發送請求,如下:
可以看到在解決方案資源管理器中已經生成了2個圖片文件,如下:
===================================================================
補充:
實際項目中需要在終結點 UploadPhoto( ) 中增加 try{ } catch{ }語句處理異常並寫入日志,
之前的篇章有詳細介紹,可以參考。