使用 ASP.NET Core web API 将图像上传到 Cloudianary 时出现空文件错误

Empty File error while uploading images to Cloudianary using ASP.NET Core web API

我在使用 ASP.NET Core Web API 将图像上传到 Cloudinary 时遇到问题。 上传到 Cloudinary 的方法使用 IFormFile 接收图像,然后将其复制到流中。然后我的 Cloudinary Upload 方法被配置为将图像上传到 Cloudinary 但是当调用上传方法时我得到一个错误,空文件。 这是我的代码。

public class CloudinaryAPI
{
    private readonly Cloudinary cloudinary;

    /// <summary>
    /// Set up cloudinary account 
    /// </summary>
    /// <param name="cloud">Cloud name</param>
    /// <param name="apiKey">API Key</param>
    /// <param name="apiSecret">API Secret</param>
    public CloudinaryAPI(string cloud = "", 
        string apiKey = "", string apiSecret = "")
    {
        Account account = new Account
        {
            Cloud = cloud,
            ApiKey = apiKey,
            ApiSecret = apiSecret
        };

        this.cloudinary = new Cloudinary(account);
    }

    /// <summary>
    /// Upload image using a Stream
    /// </summary>
    /// <param name="tream"></param>
    /// <returns></returns>
    public async Task<ImageUploadResult> UploadImage(Stream stream)
    {
        if(stream != null)
        {
            var uploadParams = new ImageUploadParams()
            {
                File = new FileDescription(Guid.NewGuid().ToString(), stream)
            };
            var uploadResult = await cloudinary.UploadAsync(uploadParams);
            return uploadResult;
        }
        throw new ArgumentNullException(message: "Something went wrong while trying to process image", null);
    }
}

这是接收请求的控制器动作。

    public async Task<IActionResult> UpdateProfilePicture(IFormFile 
    fileUpload)
    {
        using (Stream stream = new MemoryStream())
        {
            stream.Flush();
            stream.Position = 0;
            await fileUpload.CopyToAsync(stream);

            // Upload the file if less than 500KB

            if (stream.Length < 524288)
            {
                // Upload image to cloudinary
                await cloudinary.UploadImage(stream);
            }

这是常见错误。您需要从 FromForm 获取文件。 所以你需要通过表单发送文件到后台。

 public async Task<IActionResult> UpdateProfilePicture([FromForm] IFormFile fileUpload)
 { ... }

我发现我必须在从 IFormFile 复制流后重置它的位置。

public async Task<IActionResult> UpdateProfilePicture(IFormFile 
fileUpload)
{
    using (Stream stream = new MemoryStream())
    {
        stream.Flush();
        await fileUpload.CopyToAsync(stream);
        stream.Position = 0;

在将文件复制到流后stream.Position应设置为0