gpt4 book ai didi

C# - 多次处理流时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:10 24 4
gpt4 key购买 nike

我有一个 android 移动应用程序,它具有设置个人资料图片的功能。

我将包含图像路径的变量发送到执行以下操作的方法:

string imagePath = _ProfilePicture.GetTag (Resource.String.profile_picture_path).ToString ();
byte[] imageBytes = System.IO.File.ReadAllBytes(imagePath);
Stream imageStream = new MemoryStream(imageBytes);

在这段代码之后,我将 imageStream 变量发送到位于 WCF 服务上的 UploadUserProfilePicture(imageStream);

目前它只发送流,但是因为我们不能发送另一个包含扩展名的参数。我们将所有图像保存为 png。然而,我找到了一个库,它要求将流解析为字节,然后根据文件类型可以检索的字节。

但是,当我随后尝试使用相同的流将文件写入服务器上的位置时,该位置位于末尾,因此创建的文件始终为 0 字节。

我试过:用另一种方法转换为字节,只返回文件类型,但原始位置仍在最后。CopyTo 函数给了我相同的结果。我尝试使用 Seek 函数并将其位置设置回零,但是我得到了 NotSupportedException。

我也试过这个:

string content;
var reader = new StreamReader(image);
content = reader.ReadToEnd();

image.Dispose();
image = new MemoryStream(Encoding.UTF8.GetBytes(content));

^ 这似乎破坏了流,因为我无法获取 FileType 也无法将其写入上述位置。

我也看过:How to read a Stream and reset its position to zero even if stream.CanSeek == false

这是 WCF 服务上的方法:

public Result UploadUserProfilePicture(Stream image)
{
try
{
FileType fileType = CommonMethods.ReadToEnd(image).GetFileType();

Guid guid = Guid.NewGuid();
string imageName = guid.ToString() + "." + fileType.Extension;
var buf = new byte[1024];
var path = Path.Combine(@"C:\" + imageName);
int len = 0;
using (var fs = File.Create(path))
{
while ((len = image.Read(buf, 0, buf.Length)) > 0)
{
fs.Write(buf, 0, len);
}
}

return new Result
{
Success = true,
Message = imageName
};
}
catch(Exception ex)
{
return new Result
{
Success = false,
Message = ex.ToString()
};
}

使用的图书馆链接:https://github.com/Muraad/Mime-DetectiveCommonMethods.ReadToEnd(image) 方法可以在这里找到:How to convert an Stream into a byte[] in C#?作为问题的答案

我希望这是关于我的问题的足够信息。

最佳答案

在服务器端,您从 WCF 接收到不支持查找操作的流。但是,您可以将流读取到内存中,因为 GetFileType 方法需要一个字节数组作为输入参数。您可以使用 File.WriteAllBytes 以非常简单的方式将数组的字节写入磁盘,而不是再次访问原始流。方法:

public Result UploadUserProfilePicture(Stream image)
{
try
{
// Store bytes in a variable
var bytes = CommonMethods.ReadToEnd(image);
FileType fileType = bytes.GetFileType();

Guid guid = Guid.NewGuid();
string imageName = guid.ToString() + "." + fileType.Extension;
var path = Path.Combine(@"C:\" + imageName);
File.WriteAllBytes(path, bytes);
return new Result
{
Success = true,
Message = imageName
};
}
catch(Exception ex)
{
return new Result
{
Success = false,
Message = ex.ToString()
};
}
}

请注意,这意味着您可能会在内存中存储大量字节,就像您之前所做的一样。如果您可以在不将所有字节读入内存的情况下使用流会更好,因此寻找可以处理流的 GetFileType 方法的替代方法非常值得花时间。然后您可以先将图像保存到一个临时文件,然后打开一个新的 FileStream 以发现正确的文件类型,以便您可以重命名该文件。

关于C# - 多次处理流时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35478719/

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