Upload Image to .NET Core 2.1 API

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Upload Image to .NET Core 2.1 API相关的知识,希望对你有一定的参考价值。

原文地址:https://www.codeproject.com/Articles/1256591/Upload-Image-to-NET-Core-2-1-API

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ImageWriter.Helper

    public class WriterHelper
    
        public enum ImageFormat
        
            bmp,
            jpeg,
            gif,
            tiff,
            png,
            unknown
        

        public static ImageFormat GetImageFormat(byte[] bytes)
        
            var bmp = Encoding.ASCII.GetBytes("BM");     // BMP
            var gif = Encoding.ASCII.GetBytes("GIF");    // GIF
            var png = new byte[]  137, 80, 78, 71 ;              // PNG
            var tiff = new byte[]  73, 73, 42 ;                  // TIFF
            var tiff2 = new byte[]  77, 77, 42 ;                 // TIFF
            var jpeg = new byte[]  255, 216, 255, 224 ;          // jpeg
            var jpeg2 = new byte[]  255, 216, 255, 225 ;         // jpeg canon

            if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
                return ImageFormat.bmp;

            if (gif.SequenceEqual(bytes.Take(gif.Length)))
                return ImageFormat.gif;

            if (png.SequenceEqual(bytes.Take(png.Length)))
                return ImageFormat.png;

            if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
                return ImageFormat.tiff;

            if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
                return ImageFormat.tiff;

            if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
                return ImageFormat.jpeg;

            if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
                return ImageFormat.jpeg;

            return ImageFormat.unknown;
        
    

 IImageWriter.cs 

using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;

namespace ImageWriter.Interface

    public interface IImageWriter
    
        Task<string> UploadImage(IFormFile file);
    
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using ImageWriter.Helper;
using ImageWriter.Interface;
using Microsoft.AspNetCore.Http;

namespace ImageWriter.Classes

    public class ImageWriter : IImageWriter
    
        public async Task<string> UploadImage(IFormFile file)
        
            if (CheckIfImageFile(file))
            
                return await WriteFile(file);
            

            return "Invalid image file";
        

        /// <summary>
        /// Method to check if file is image file
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        private bool CheckIfImageFile(IFormFile file)
        
            byte[] fileBytes;
            using (var ms = new MemoryStream())
            
                file.CopyTo(ms);
                fileBytes = ms.ToArray();
            

            return WriterHelper.GetImageFormat(fileBytes) != WriterHelper.ImageFormat.unknown;
        

        /// <summary>
        /// Method to write file onto the disk
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public async Task<string> WriteFile(IFormFile file)
        
            string fileName;
            try
            
                var extension = "." + file.FileName.Split(.)[file.FileName.Split(.).Length - 1];
                fileName = Guid.NewGuid().ToString() + extension; //Create a new Name 
                                                              //for the file due to security reasons.
                var path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\\images", fileName);

                using (var bits = new FileStream(path, FileMode.Create))
                
                    await file.CopyToAsync(bits);
                
            
            catch (Exception e)
            
                return e.Message;
            

            return fileName;
        
    
using System.Threading.Tasks;
using ImageWriter.Interface;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace ImageUploader.Handler

    public interface IImageHandler
    
        Task<IActionResult> UploadImage(IFormFile file);
    

    public class ImageHandler : IImageHandler
    
        private readonly IImageWriter _imageWriter;
        public ImageHandler(IImageWriter imageWriter)
        
            _imageWriter = imageWriter;
        

        public async Task<IActionResult> UploadImage(IFormFile file)
        
            var result = await _imageWriter.UploadImage(file);
            return new ObjectResult(result);
        
    
using System.Threading.Tasks;
using ImageUploader.Handler;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace ImageUploader.Controllers

    [Route("api/image")]
    public class ImagesController : Controller
    
        private readonly IImageHandler _imageHandler;

        public ImagesController(IImageHandler imageHandler)
        
            _imageHandler = imageHandler;
        

        /// <summary>
        /// Uplaods an image to the server.
        /// </summary>
        /// <param name="file"></param>
        /// <returns></returns>
        public async Task<IActionResult> UploadImage(IFormFile file)
        
            return await _imageHandler.UploadImage(file);
        
    
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            
            else
            
                app.UseHsts();
            

            //Use this to set path of files outside the wwwroot folder
            //app.UseStaticFiles(new StaticFileOptions
            //
            //    FileProvider = new PhysicalFileProvider(
            //        Path.Combine(Directory.GetCurrentDirectory(), "StaticFiles")),
            //    RequestPath = "/StaticFiles"
            //);

            app.UseStaticFiles(); //letting the application know that we need access to wwwroot folder.

            app.UseHttpsRedirection();
            app.UseMvc();
        
// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddTransient<IImageHandler, ImageHandler>();
            services.AddTransient<ImageWriter.Interface.IImageWriter, 
                                  ImageWriter.Classes.ImageWriter>();
        

 

以上是关于Upload Image to .NET Core 2.1 API的主要内容,如果未能解决你的问题,请参考以下文章

vue2+express4图片上传

仅当 upload_to 被称为 django 时才调整图像大小

imageField 中的 upload_to 属性无法将图像保存在磁盘上

Django使用upload_to实例保存图像保持实例属性无

文件上传图片上传多图上传TagHelper

asp.net core In Docker(Image)