在 VBA 中使用 curl 上传图像

Posted

技术标签:

【中文标题】在 VBA 中使用 curl 上传图像【英文标题】:Upload image using curl in VBA 【发布时间】:2020-03-21 11:01:58 【问题描述】:

我已经在一个支持 API 的网站上注册,并且我已经测试了 CURL 命令行,它对我来说很好用

curl --location --request POST "https://api.imgbb.com/1/upload?key=APIKEY" --form "image=iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="

这是 API 信息页面 https://api.imgbb.com/

我不知道如何使用 excel VBA 发送等效命令行?我对这些东西完全陌生,我搜索了很多,但不知道事情是怎么回事

我发现这个链接可能会有所帮助,但它在 VB.NET 中 Help with Imgur API and VB.NET - Image POST

** 现在我得到了解决方案,并且我已经开发出来了

Sub Test()
Dim v As Double, sPath As String, sAPIKey As String, sBase64 As String, cmd As String

sPath = ThisWorkbook.Path & "\Result.txt"
sAPIKey = "APIKEY"
sBase64 = ConvertFileToBase64(ThisWorkbook.Path & "\Logo.png")

cmd = Replace(Replace("curl --location --request POST ""https://api.imgbb.com/1/upload?key=¤"" --form ""image=$"" -o ", "¤", sAPIKey), "$", sBase64) & sPath
v = Shell(cmd)
Debug.Print cmd & " Completed" & vbCr & "Process " & v
End Sub

Public Function ConvertFileToBase64(strFilePath As String) As String
Const UseBinaryStreamType = 1

Dim streamInput: Set streamInput = CreateObject("ADODB.Stream")
Dim xmlDoc: Set xmlDoc = CreateObject("Microsoft.XMLDOM")
Dim xmlElem: Set xmlElem = xmlDoc.CreateElement("tmp")

streamInput.Open
streamInput.Type = UseBinaryStreamType
streamInput.LoadFromFile strFilePath
xmlElem.DataType = "bin.base64"
xmlElem.NodeTypedValue = streamInput.Read
ConvertFileToBase64 = Replace(xmlElem.Text, vbLf, "")

Set streamInput = Nothing
Set xmlDoc = Nothing
Set xmlElem = Nothing
End Function

这适用于小尺寸,但不适用于大尺寸..示例我有一个 Logo.png,大小为 545KB,但失败了。而其他较小的图片上传得很好

我手动尝试过,也失败了。似乎 cms 窗口允许的字符数有限制,所以我无法在命令行中获取所有 base64 字符串

【问题讨论】:

我不使用 curl,所以我不确定this 是否有帮助? 您可以从命令提示符运行 curl 命令行。只需在网站imgbb.com 注册,您就可以通过此链接https://api.imgbb.com/ 获得免费的 API 密钥。然后你可以运行我发布的线路...... 不,我对 curl 不感兴趣。只是为了帮助您提供链接:) 【参考方案1】:

您可以使用Shell

Sub mycurl()

  Dim var As Double, cmd As String
  cmd = "curl -I ""https://api.imgbb.com/"" -o imgbb.txt" ' head only
  var = Shell(cmd)
  MsgBox cmd & " completed" & vbCr & "Process " & var

End Sub

看起来 API 接受二进制文件,所以不需要 base64 编码。试试

cmd = "curl --location --request POST ""https://api.imgbb.com/1/upload?" & _
      "key=" & sAPIKey & """ " & _
      "--form image=@""/path/Logo.png"" -o " & sPath & "/response.json"



【讨论】:

太好了。如何获取 JSON 响应? @Yasser 这是一个 Curl 问题,不是 VBA,而是 -o filename 将输出保存到文件中,所以如果对您的请求的响应是 JSON,我猜它会在那里。 非常感谢。你能给我一个导出到文件的例子吗? 我看了一下,但无法编辑我自己的以适应。你能给我一个基于 cmd 行的例子吗?我试过这个但失败了curl --location --request POST "https://api.imgbb.com/1/upload?key=APIKEY" --data-binary '@C:/Users/Future/Desktop/Output.txt" @yasser 我不知道。我想你可以每秒检查一下是否创建了响应文件

以上是关于在 VBA 中使用 curl 上传图像的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 php 和 curl 复制 Web 请求(图像上传)

无法使用 Twitter API、PHP 和 curl 发布图像和文本?媒体/上传和状态/更新

cURL如何上传文件?

CURL:将带边界的图像发送到 REST API

PHP Curl 类不会直接从变量上传文件,问题在哪里?

使用 VBA 宏在 Word 中水平对齐(分布)图像