stream.CopyTo - 文件为空。 ASP.NET

问题描述 投票:0回答:4

我正在使用此代码保存上传的图像:

using (var fileStream = File.Create(savePath))
{
   stream.CopyTo(fileStream);
}

当图像保存到目标文件夹时,它是空的,0 kb。这里可能出了什么问题?我在复制之前检查了stream.Length并且它不为空。

c# asp.net filestream
4个回答
86
投票

您的代码没有任何问题。您说“我在复制之前检查了流。长度并且它不为空”这一事实让我想知道复制之前的流位置

如果您已经使用过源流一次,那么尽管流的长度不是零,但它的位置可能位于流的末尾 - 所以没有什么可以复制的。

如果流是可查找的(对于

MemoryStream
FileStream
以及许多其他流),请尝试放置

stream.Position = 0

就在复制之前。这会将流位置重置为开头,这意味着整个流将被您的代码复制。


4
投票

我建议将以下内容放在之前

CopyTo()

fileStream.Position = 0

确保在此之后使用

Flush()
,以避免复制后出现空文件。

fileStream.Flush()

2
投票

将我的项目从 .NET Core 1 迁移到 2.2 后,这个问题开始出现。

我通过将文件流的

Position
设置为零来解决此问题。

using (var fileStream = new FileStream(savePath, FileMode.Create))
{
    fileStream.Position = 0;
    await imageFile.CopyToAsync(fileStream);
}

0
投票

包含 FileAccess 和 FileShare 将很有帮助,尤其是当路径是 NFS/CIFS 时

文件流构造函数(System.IO)|微软学习

文件流(字符串,文件模式,文件访问,文件共享)

未经授权的访问异常 对于指定的路径,操作系统不允许所请求的访问,如

当访问权限为 Write 或 ReadWrite 并且文件或目录设置为只读访问权限时。

© www.soinside.com 2019 - 2024. All rights reserved.