在 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 请求(图像上传)