1、配置文件Web.config
<appSettings> <!--FileService--> <add key="ftpUserName" value="fooUserName" /> <add key="ftpPassword" value="fooPass" /> <!--FileController--> <add key="fileServiceLocalPath" value="~/App_Data/Upload" /> <add key="fileServiceStoragePath" value="fooFtpAddress" /> <add key="useCloud" value="false" /> </appSettings>
2、文件上传下载图片查看FileController
实现文件上传、文件下载、图片查看的Controller(控制器)。
[Authorize] [RoutePrefix("api/File")] public class FileController : ApiController { IFileService fileService = null; public FileController(IFileService _fileService) { fileService = _fileService; } [Route("Upload"), HttpPost] public async Task<IHttpActionResult> Upload() { #region Condition if (!Request.Content.IsMimeMultipartContent()) return Content(HttpStatusCode.UnsupportedMediaType, Messages.FUW0001); #endregion /// `localPath` 和 `useCloud` 是在 Web.Config中获取. string localPath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["fileServiceLocalPath"]); bool useCloud = Convert.ToBoolean(ConfigurationManager.AppSettings["useCloud"]); var provider = new MultipartFormDataStreamProvider(localPath); try { /// 载入文件在本地存储 await Request.Content.ReadAsMultipartAsync(provider); /// 检查是否存在有效的文件 if (provider.FileData.Count == 0) return BadRequest(Messages.FUE0001 /*Message Type FUE001 = File Not Found */); IList<FileDto> modelList = new List<FileDto>(); foreach (MultipartFileData file in provider.FileData) { string originalName = file.Headers.ContentDisposition.FileName; if (originalName.StartsWith("\"") && originalName.EndsWith("\"")) { originalName = originalName.Trim('"'); } if (originalName.Contains(@"/") || originalName.Contains(@"\")) { originalName = Path.GetFileName(originalName); } /// 文件信息存储到数据库 FileDto fileDto = new FileDto { OriginalName = Path.GetFileNameWithoutExtension(originalName), StorageName = Path.GetFileName(file.LocalFileName), Extension = Path.GetExtension(originalName).ToLower().Replace(".", ""), Size = new FileInfo(file.LocalFileName).Length }; modelList.Add(fileDto); } if (useCloud) await fileService.SendCloud(modelList,localPath); await fileService.Add(modelList, IdentityClaimsValues.UserID<Guid>()); return Ok(Messages.Ok); } catch (Exception exMessage) { return Content(HttpStatusCode.InternalServerError, exMessage); } } [Route("Download"), HttpGet] public async Task<IHttpActionResult> Download(Guid id) { ///获取文件信息从数据库 var model = await fileService.GetByID(id); if (model == null) return BadRequest(); /// `localPath` 在 Web.Config中. string localPath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["fileServiceLocalPath"]); string root = localPath + "\\" + model.StorageName; byte[] fileData = File.ReadAllBytes(root); var stream = new MemoryStream(fileData, 0, fileData.Length); var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new ByteArrayContent(stream.ToArray()) }; response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = model.OriginalName + "." + model.Extension, Size=model.Size }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); IHttpActionResult result = ResponseMessage(response); return result; } [Route("ImageReview"), HttpGet] public async Task<IHttpActionResult> ImageReview(Guid id) { /// 获取文件信息从数据库 var model = await fileService.GetByID(id); if (model == null) return BadRequest(); /// `localPath` 在 Web.Config中. string localPath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["fileServiceLocalPath"]); string root = localPath + "\\" + model.StorageName; byte[] fileData = File.ReadAllBytes(root); var stream = new MemoryStream(fileData, 0, fileData.Length); var response = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(stream) }; response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/"+ model.Extension); IHttpActionResult result = ResponseMessage(response); return result; } }
3、将文件存储到FTP的FileService类
实现将服务器本地文件传输到FTP服务器
public interface IFileService { Task SendCloud(IList<FileDto> modelList, string localPath); } public class FileService : IFileService { public Task SendCloud(IList<FileDto> modelList,string localPath) { /// `ftpUserName`, `ftpPassword` 和 `storagePath` 在 Web.Config中获取. string ftpUserName = ConfigurationManager.AppSettings["ftpUserName"]; string ftpPassword = ConfigurationManager.AppSettings["ftpPassword"]; string storagePath = ConfigurationManager.AppSettings["fileServiceStoragePath"]; /// 上传文件到FTP服务器 foreach (var model in modelList) { FtpWebRequest req = (FtpWebRequest)WebRequest.Create(storagePath + model.StorageName); req.UseBinary = true; req.Method = WebRequestMethods.Ftp.UploadFile; req.Credentials = new NetworkCredential(ftpUserName, ftpPassword); byte[] fileData = File.ReadAllBytes(localPath + "\\" + model.StorageName); req.ContentLength = fileData.Length; Stream reqStream = req.GetRequestStream(); reqStream.Write(fileData, 0, fileData.Length); reqStream.Close(); } return Task.CompletedTask; } }