gpt4 book ai didi

c# - 如果我检查流中的有​​效图像,我无法将字节写入服务器

转载 作者:行者123 更新时间:2023-12-03 12:19:26 24 4
gpt4 key购买 nike

我试图在将文件上传到图像服务器之前检查它是否是图像。我使用以下函数来完成此操作,效果非常好:

static bool IsValidImage(Stream imageStream)
{
bool isValid = false;
try
{
// Read the image without validating image data
using (Image img = Image.FromStream(imageStream, false, false))
{
isValid = true;
}
}
catch
{
;
}
return isValid;
}

问题是,当随后立即调用以下代码时,该行:

while ((bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize)) > 0)

评估为零并且没有读取任何字节。我注意到当我删除IsValidImage 函数,读取字节并写入文件。它似乎字节只能读取一次?知道如何解决这个问题吗?

using (FileStream outfile = new FileStream(filePath, FileMode.Create))
{
const int bufferSize = 65536; // 64K
int bytesRead = 0;

Byte[] buffer = new Byte[bufferSize];

while ((bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize)) > 0)
{
outfile.Write(buffer, 0, bytesRead);
}

outfile.Close(); //necessary?

}

更新:感谢您的帮助,马克。我是流操作的新手,可以使用一点这里有更多帮助。我尝试了一下,但可能混淆了文件流和内存流的使用。你介意看一下吗?再次感谢。

using (FileStream outfile = new FileStream(filePath, FileMode.Create))
using (MemoryStream ms = new MemoryStream())
{

byte[] buffer = new byte[1024];
int bytesRead;

while ((bytesRead = request.FileByteStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}

// ms now has a seekable/rewindable copy of the data

// TODO: read ms the first time

// I replaced request.FileByteStream with ms but am unsure about
// the using statement in the IsValidImage function.

if (!IsValidImage(ms) == true)
{
ms.Close();
request.FileByteStream.Close();
return;
}

ms.Position = 0;

// TODO: read ms the second time

byte[] m_buffer = new byte[ms.Length];
while ((bytesRead = ms.Read(m_buffer, 0, (int)ms.Length)) > 0)
{
outfile.Write(m_buffer, 0, bytesRead);
}


}


static bool IsValidImage(MemoryStream imageStream)
{
bool isValid = false;
try
{
// Read the image without validating image data
using (Image img = Image.FromStream(imageStream, false, false))
{
isValid = true;
}
}
catch
{
;
}
return isValid;
}

最佳答案

当您从任何流中读取数据时,位置都会增加。如果您读到一个流的末尾(这是典型的情况),然后尝试再次读取,那么它将返回 EOF。

对于某些流,您可以寻找 - 例如,将Position设置为0。但是,您应该尽量避免依赖它,因为它对于许多流可用(特别是当涉及网络 IO 时)。您可以通过 CanSeek 查询此功能,但避免这种情况会更简单 - 部分就好像您基于此进行分支一样,您突然需要维护两倍的代码.

如果您需要两次数据,则选项取决于数据的大小。对于小流,将其缓冲在内存中,作为 byte[]MemoryStream。对于较大的流(或者如果您不知道大小),则写入临时文件(然后删除)是一种合理的方法。您可以根据需要多次打开和读取该文件(串行,而不是并行)。


如果您满意该流不是太大(尽管可能添加上限以防止人们上传交换文件等):

using (MemoryStream ms = new MemoryStream()) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0) {
ms.Write(buffer, 0, bytesRead);
}

// ms now has a seekable/rewindable copy of the data

// TODO: read ms the first time
ms.Position = 0;
// TODO: read ms the second time
}

关于c# - 如果我检查流中的有​​效图像,我无法将字节写入服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1777012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com