内存流中的 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 文档