内存流中的 InvalidOperationException

Posted

技术标签:

【中文标题】内存流中的 InvalidOperationException【英文标题】:InvalidOperationException in Memory Streams 【发布时间】:2020-12-11 03:08:21 【问题描述】:

我正在尝试将图像上传到 cloudinary 云。该文件可以很好地转换为内存流,但是当我尝试调用 cloudinary 的上传方法来上传图像时,我得到了 InvlalidOperationException。我的想法是,将文件转换为流有问题。See the image showing error

[HttpPost]
    public async Task<IActionResult> AddPhotoForUser(int userId, [FromForm] AddPhotoDto addPhotoDto)
    
        try
        
            if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
            
                return Unauthorized();
            

            var userFromRepo = await _datingRepository.GetUser(userId);

            var file = addPhotoDto.File;
            var uploadResult = new ImageUploadResult();

            if (file.Length > 0)
            
                using (var stream = file.OpenReadStream())
                
                    var uploadParams = new ImageUploadParams()
                    
                        File = new FileDescription(file.Name, stream),
                        Transformation = new Transformation()
                            .Width(500).Height(500).Crop("fill").Gravity("face")
                    ;

                    uploadResult = _cloudinary.Upload(uploadParams);
                
            

            addPhotoDto.Url = uploadResult.Url.ToString();
            addPhotoDto.PublicId = uploadResult.PublicId;

            var photo = _mapper.Map<Photo>(addPhotoDto);

            if (!userFromRepo.Photos.Any(p => p.IsMain))
            
                photo.IsMain = true;
            

            userFromRepo.Photos.Add(photo);
            if (await _datingRepository.SaveAll())
            
                var photoToReturn = _mapper.Map<ReturnPhotoDto>(photo);
                return CreatedAtRoute("GetPhoto", new  id = photo.Id , photoToReturn);
            

            return BadRequest("Could not add photo");
        
        catch (Exception ex)
        

            return BadRequest(ex.Message);
        
       
    

【问题讨论】:

你能确保File.OpenReadStream().Read() 没问题吗? asp.net core 不喜欢同步读/写 你想说什么? 避免对 调试器 告诉您有关对象的内容感到困惑。这些不是运行时异常,只是调试器尝试显示流的属性时发生的情况。 MemoryStream 确实not implement timeouts,它完全没有理由这样做。由于数据存储在内存中。那里没什么可看的,继续前进。 @Malik 我不熟悉 cloudinary ,但是由于您使用 .Upload 而没有 await ,所以我认为这不是异步调用,因此它是从您当前的同步读取请求,并且 asp.net 核心不喜欢同步读/写,它可能会基于您的 kestrel 设置(或默认设置),您可以通过使用file.OpenReadStream().Read(buffer, 0, buffer.length) 来测试它是否导致它,您必须使用 @ 987654329@ 将流复制到缓冲的MemoryStream如果它也thorw 异常。如果它没有抛出则忽略我,它不是由这个问题引起的 【参考方案1】:

你能分享一下你为什么使用开放流吗?你可以试试:

var imageuploadParams = new ImageUploadParams () 
                File = new FileDescription (@"https://res.cloudinary.com/demo/image/upload/v1561532539/sample.jpg"),
                PublicId = "myimage",
                Transformation = new Transformation().Width(500).Height(500).Crop("fill").Gravity("face")
            ;
            var ImageuploadResult = cloudinary.Upload (imageuploadParams);

【讨论】:

我在请求中发送图像,为什么不能将图像路径提供给 FileDescription。

以上是关于内存流中的 InvalidOperationException的主要内容,如果未能解决你的问题,请参考以下文章

使用 iTextSharp 将文本添加到内存流中的现有多页 PDF 文档

从内存流中读取存储的 PDF

Perl、ClamAV、扫描流中的病毒

如何在 JavaScript 中解析大型 JSON 流中的项目?

来自流中的字符串,用于多种对象类型

从文件夹中读取 Java 流中的块中的文件名