从IFormFile获取内存流时出现异常

3
我上传了一张图片,并希望将其发送到第三方服务(Cloudinary),而无需在我的服务器上保存该文件。
public async Task<List<string>> GetImagesUrlsByImage(IFormFile image)
{
    List<string> urlList = new List<string>();
    ImageUploadParams uploadParams = new ImageUploadParams();

    using (var memoryStream = new MemoryStream())
    {
        await image.CopyToAsync(memoryStream);
        uploadParams.File = new FileDescription(image.FileName, memoryStream);
        uploadParams.EagerTransforms = new List<Transformation>
        {
            new EagerTransformation().Width(200).Height(150).Crop("scale"),
            new EagerTransformation().Width(500).Height(200).Crop("scale")
        };

        ImageUploadResult result = await _cloudinary.UploadAsync(uploadParams);
        var url = result.SecureUrl.ToString();
        urlList.Add(url);
    }

    return urlList;
}

我没有收到异常,但Cloudinary的结果消息中有一个错误消息:“没有图像”;

在调试过程中,我看到了这些错误:

输入图片描述

这段代码需要怎么修改?


1
但是表单文件已经保存在您的服务器上的临时目录中,因此不需要将文件保存到我的服务器上。image的流已经指向一个文件流。 - CodeCaster
为什么要使用MemoryStream,当IFormFile已经提供了对流的访问? - mjwills
1
通过使用 OpenReadStream?,我删除了 MemoryStream 部分并使其工作,我之前不知道这一点,谢谢。 - Offir
1个回答

2

如果其他功能都正常,那么很可能只需要重置MemoryStream中光标的位置:

   ms.Position = 0;

因此,完整的示例:

public async Task<List<string>> GetImagesUrlsByImage(IFormFile image)
{
    List<string> urlList = new List<string>();
    ImageUploadParams uploadParams = new ImageUploadParams();

    using (var memoryStream = new MemoryStream())
    {
        await image.CopyToAsync(memoryStream);

        ms.Position = 0; // set cursor to the beginning of the stream.

        uploadParams.File = new FileDescription(image.FileName, memoryStream);
        uploadParams.EagerTransforms = new List<Transformation>
        {
            new EagerTransformation().Width(200).Height(150).Crop("scale"),
            new EagerTransformation().Width(500).Height(200).Crop("scale")
        };

        ImageUploadResult result = await _cloudinary.UploadAsync(uploadParams);
        var url = result.SecureUrl.ToString();
        urlList.Add(url);
    }

    return urlList;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接