0

我试图上传单个图像文件。示例代码如下:

        /// <summary>
        /// Uploads a single image document 
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Route("{id}/scan-doc-image")]
        //[RequestFormLimits(ValueLengthLimit = int.MaxValue, MultipartBodyLengthLimit = int.MaxValue)]
        public async Task<ActionResult> UploadImage(int id, IFormFile file)
        {
            // more validation goes here.
            if (file == null)
            {
                return BadRequest();
            }

            // save image if any
            if (file.Length > 0)
            {
                var uploads = Path.Combine(_envirnment.WebRootPath, "uploads");

                using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.Create))
                {
                    await file.CopyToAsync(fileStream);
                }
            }

            return Ok();
        }

这是我注意到的:

  1. 调用此 API 会自动停止服务。我尝试了很多次,它总是关闭它。当我进行其他 API 调用时,它并没有停止服务。仅供参考

  2. 我也尝试从 POSTMAN 拨打电话。这一次,它没有关闭服务,但我不断收到错误:Failed to read the request form. Missing content-type boundary. 请注意,我将 Content-Type 指定为multipart/form-data. 当我将边界指定为小于最大值的数字时,它仍然会出错。即使我取消注释RequestFormLimit您在上面看到的属性,它也没有帮助。

那么我在这里缺少什么?我只需要它来上传单个图像文件。

4

1 回答 1

1

我也尝试从 POSTMAN 拨打电话。这一次,它没有关闭服务,但我不断收到错误消息:无法读取请求表。缺少内容类型边界。请注意,我将 Content-Type 指定为 multipart/form-data。当我将边界指定为小于最大值的数字时,它仍然会出错。即使我取消注释您在上面看到的 RequestFormLimit 属性,它也无济于事。

在此处输入图像描述 无需Content-Type手动添加标题。您正在覆盖Postman设置的值。只需form-data在 POST 请求中选择并发送您的请求以查看它是否有效。无需设置header何时form-data发布。只需删除Content-Type上传如下

在此处输入图像描述





注意可能导致错误的路径

如果您使用的是 Web API 项目,您将在_envirnment.WebRootPath. Web API 项目中没有wwww目录。

在此处输入图像描述

解决方案

改变WebRootPath

        var uploads = Path.Combine(_envirnment.WebRootPath, "uploads");

ContentRootPath

        var uploads = Path.Combine(_envirnment.ContentRootPath, "uploads");

测试

在此处输入图像描述

控制器代码

如果指定文件夹“uploads”不存在,则先创建,然后将文件保存到该文件夹​​。如果文件夹已经存在,只需将文件保存在其中。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WebAPIDemos.Controllers
{

    [ApiController]
    [Route("[controller]")]
    public class FileController : ControllerBase
    {
        private readonly IWebHostEnvironment _envirnment;

        public FileController(IWebHostEnvironment appEnvironment)
        {
            _envirnment = appEnvironment;
        }

        [HttpPost]
        [Route("{id}/scan-doc-image")]
        //[RequestFormLimits(ValueLengthLimit = int.MaxValue, MultipartBodyLengthLimit = int.MaxValue)]
        public async Task<ActionResult> UploadImage(int id, IFormFile file)
        {
            // more validation goes here.
            if (file == null)
            {
                return BadRequest();
            }

            // save image if any
            if (file.Length > 0)
            {
                //var uploads = Path.Combine(_envirnment.WebRootPath, "uploads");
                var uploads = Path.Combine(_envirnment.ContentRootPath, "uploads");

                var destinationDirectory = new DirectoryInfo(uploads);

                if (!destinationDirectory.Exists)
                    destinationDirectory.Create();


                using (var fileStream = new FileStream(Path.Combine(uploads, file.FileName), FileMode.Create))
                {
                    await file.CopyToAsync(fileStream);
                }
            }

            return Ok();
        }
    }
}
于 2020-09-04T06:26:06.527 回答