将二进制文件转换为Base64字符串

6
我需要实时将上传的二进制文件转换为base64字符串格式。我正在使用ASP和Vbscript,使用Midori的组件进行base64转换。对于小型文件(<20K),性能还可以。 但当超过75或100K时,完全失效。有没有有效的方法将大型二进制文件(2MB)转换为base64字符串格式?
谢谢, 肯尼
6个回答

2
我已经通过实现一个 .net 组件来解决这个问题,将其转换为 base64 字符串。难点在于从 ASP 发送到 .net COM 的二进制数据被接收为字符串。Convert.ToBase64() 只接受 byte[]。所以我尝试将字符串转换为 byte[]。
但是,在 .net 中可用的编码(Unicode、ASCII、UTF)不起作用。使用这些编码会有数据丢失。最后,我通过使用 StringReader 对象完成了它。逐个字符(16 位)读取并将它们转换为(8 位)byte[] 数组。
而且性能最佳。
祝好, Siva.

1
使用MSXML来为您进行编码。这里是封装该过程的函数:-
 Function ToBase64(rabyt)

     Dim xml: Set xml = CreateObject("MSXML2.DOMDocument.3.0")
     xml.LoadXml "<root />"
     xml.documentElement.dataType = "bin.base64"
     xml.documentElement.nodeTypedValue = rabyt

     ToBase64 = xml.documentElement.Text

 End Function

请注意,这将在base64编码中包含换行符,但大多数base64解码器都能容忍换行符。如果不能容忍,您可以简单地使用Replace(base64, vbLF, "")来删除它们,这仍然比纯VBScript解决方案更快。

编辑 示例用法:

Dim sBase64: sBase64 = ToBase64(Request.BinaryRead(Request.TotalBytes))

嗨, 感谢回复。我正在将二进制文件转换为base64。二进制文件是从请求对象中读取的。输入的类型是什么(rabyt)?TIA - Kenney
@Kenny: rabyt是一个字节数组。 - AnthonyWJones
你好,Anthony W Jones, 我的请求对象上传了多个二进制文件。我使用BinaryRead()方法来获取整个请求对象。然后我使用MidB()方法从字节数组中提取单个文件。MidB()返回的是string类型的文件。那么我应该如何将每个文件转换为字节数组? - Kenney
如果您在多部分POST中有多个文件,则使用经典ASP会变得非常棘手,特别是如果您无法在服务器上包含任何自定义组件。 - AnthonyWJones

1

你应该使用.NET方法Convert.ToBase64String和Convert.FromBase64String。

使用Convert.FromBase64String()方法。这将返回二进制数据(作为字节数组)。

要将二进制数据转换为Base64字符串,请参见vbscript中从二进制数据到字符串的转换函数

来自http://www.motobit.com/tips/detpg_Base64Encode/

Function Base64EncodeBinary(inData)
  Base64EncodeBinary = Base64Encode(BinaryToString(inData))
End Function

Function Base64Encode(inData)
  'rfc1521
  '2001 Antonin Foller, Motobit Software, http://Motobit.cz
  Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim cOut, sOut, I

  'For each group of 3 bytes
  For I = 1 To Len(inData) Step 3
    Dim nGroup, pOut, sGroup

    'Create one long from this 3 bytes.
    nGroup = &H10000 * Asc(Mid(inData, I, 1)) + _
      &H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))

    'Oct splits the long To 8 groups with 3 bits
    nGroup = Oct(nGroup)

    'Add leading zeros
    nGroup = String(8 - Len(nGroup), "0") & nGroup

    'Convert To base64
    pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)

    'Add the part To OutPut string
    sOut = sOut + pOut

    'Add a new line For Each 76 chars In dest (76*3/4 = 57)
    'If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
  Next
  Select Case Len(inData) Mod 3
    Case 1: '8 bit final
      sOut = Left(sOut, Len(sOut) - 2) + "=="
    Case 2: '16 bit final
      sOut = Left(sOut, Len(sOut) - 1) + "="
  End Select
  Base64Encode = sOut
End Function

Function MyASC(OneChar)
  If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
End Function

Krish, 相同的代码已经在Midori的组件中实现,我正在使用它。 - Kenney
Krish,你能告诉我如何在ASP - vbscript环境中完成这个任务吗?我的应用程序不支持.NET :( - Kenney
Krish, SimpleBinaryToString() - 对于ASCII文件工作得很好,但对于二进制文件则不行。我通过将二进制转换为ASCII整数代码数组并使用Midori组件将其转换为base64来解决此问题。问题是,这种转换需要更多时间,而且我无法处理大文件。 :( - Kenney
我猜你最好使用一些软件将数据传输到你的程序中。我很快会放上新代码。 - joe

0

我使用以下代码进行c#编程:

    public static string ImageToBase64(Image image, ImageFormat format)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            // Convert Image to byte[]
            image.Save(ms, format);
            byte[] imageBytes = ms.ToArray();

            // Convert byte[] to Base64 String
            string base64String = Convert.ToBase64String(imageBytes);
            return base64String;
        }
    }

    public static Image Base64ToImage(string base64String)
    {
        // Convert Base64 String to byte[]
        byte[] imageBytes = Convert.FromBase64String(base64String);
        MemoryStream ms = new MemoryStream(imageBytes, 0,
          imageBytes.Length);

        // Convert byte[] to Image
        ms.Write(imageBytes, 0, imageBytes.Length);
        Image image = Image.FromStream(ms, true);
        return image;
    }

如果您需要VBScript,可以查看http://www.freevbcode.com/ShowCode.asp?ID=5248,或许能帮到您。


0

0

这是对我有效的方法

Function Base64DataURI(url)

    'Create an Http object, use any of the four objects
    Dim Http
    Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")

    'Send request To URL
    Http.Open "GET", url, False
    Http.Send
    'Get response data As a string and encode as base64
    Base64DataURI = Encrypt(Http.ResponseText)
End Function

在我的情况下,URL 是一个脚本,可以动态生成条形码,并需要编码以包含在电子邮件中。
加密是我们用来进行 Base64 编码的标准函数,但我们需要的主要概念是通过 URL 而不是文件系统获取文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接