首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将大文件读入字节数组并将其编码为ToBase64String

将大文件读入字节数组并将其编码为ToBase64String
EN

Stack Overflow用户
提问于 2018-09-10 14:27:18
回答 2查看 3.2K关注 0票数 3

我已经实现了将整个文件内容读入Byte[]数组的POC。现在,我成功地读取了大小小于100 is的文件,当我加载大小大于100 is的文件时,该文件将引发

Convert.ToBase64String(mybytearray)无法获得局部变量或参数的值,因为没有足够的内存可用。

下面是我尝试从文件到字节数组读取内容的代码

代码语言:javascript
运行
复制
var sFile = fileName;
var mybytearray = File.ReadAllBytes(sFile);

var binaryModel = new BinaryModel
{
    fileName = binaryFile.FileName,
    binaryData = Convert.ToBase64String(mybytearray),
    filePath = string.Empty
};

我的模型类如下所示

代码语言:javascript
运行
复制
public class BinaryModel
{
    public string fileName { get; set; }
    public string binaryData { get; set; }
    public string filePath { get; set; }
}

我得到了"Convert.ToBase64String(mybytearray)无法获得局部变量或参数的值,因为没有足够的内存可用。“这个错误发生在Convert.ToBase64String(mybytearray)上。

有什么我需要注意的地方来防止这个错误吗?

注意:我不想在文件内容中添加换行符。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 14:46:59

我会使用两个文件-一个用来读取大文件,一个用来把结果写回来。

所以你会转换成64基数.然后将产生的字符串转换为字节..。然后写。

代码语言:javascript
运行
复制
    private static void ConvertLargeFileToBase64()
    {
        var buffer = new byte[16 * 1024];
        using (var fsIn = new FileStream("D:\\in.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        {
            using (var fsOut = new FileStream("D:\\out.txt", FileMode.CreateNew, FileAccess.Write))
            {
                int read;
                while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                {
                    // convert to base 64 and convert to bytes for writing back to file
                    var b64 = Encoding.ASCII.GetBytes(Convert.ToBase64String(buffer));

                    // write to the output filestream
                    fsOut.Write(b64, 0, read);
                }

                fsOut.Close();
            }
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2018-09-10 14:42:46

为了节省内存,您可以在三包中转换字节流。在Base64中,每三个字节产生4个字节。您不需要立即在内存中保存整个文件。

这里是伪代码:

代码语言:javascript
运行
复制
Repeat
1. Try to read max 3 bytes from stream
2. Convert to base64, write to output stream

和简单的执行:

代码语言:javascript
运行
复制
using (var inStream = File.OpenRead("E:\\Temp\\File.xml"))
using (var outStream = File.CreateText("E:\\Temp\\File.base64"))
{
    var buffer = new byte[3];
    int read;
    while ((read = inStream.Read(buffer, 0, 3)) > 0)
    {
        var base64 = Convert.ToBase64String(buffer, 0, read);
        outStream.Write(base64);
    }
}

提示:3的每一个乘法都是有效的。内存越高,性能越好,内存越少,性能越差.

附加信息:

文件流就是一个例子。因此,流使用[HttpContext].Response.OutputStream并直接写入它。在一个块中处理数百兆字节将杀死您和您的服务器。

考虑一下总的内存需求。100 MB的字符串,导致133 MB的字节数组,因为您写了关于模型,我希望这133 MB的副本作为响应。记住这只是一个简单的请求。几个这样的请求会耗尽你的记忆。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52260025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档