在Mac VBA中使用curl通过HTTP POST发送文件



我正在尝试通过Mac Excel VBA通过curl发送图像文件。 我从如何从 Mac 版 Excel VBA 发出 HTTP GET 中得到了很好的帮助,我大部分都可以工作。 我可以通过邮寄方式发送数据并获得服务器响应。 但是,当我尝试上传文件时,代码失败。 下面是一个从终端应用程序完美执行的 curl 字符串示例:curl -H "apikey:helloworld" --form "file=@/Various/ImageTest/Puzzle2.smaller.jpg" https://api.ocr.space/Parse/Image请注意,路径名必须以"@"开头,顶层是根目录。此外,图像文件是我Mac上的图像,但是如果您尝试测试上述内容,只需指向您上的任何图像文件即可。 服务器响应上述内容。 但是,当我使用相同的代码并将其放入 VBA 时,它会失败。 除了加载文件之外,我在所有事情上都取得了成功。 但是当我尝试上传文件时,我返回的代码为 6656,没有别的。 我不相信6656来自服务器,我认为它直接来自我的Mac。 这是一个例子

Sub RunTest2()
Dim result As String
Dim exitCode As Long
Dim Stringtest As String
Dim StringToSend As String
StringToSend = "curl -H 'apikey:helloworld' --form 'file=@/Various/ImageTest/Puzzle2.smaller.jpg' https://api.ocr.space/Parse/Image"
result = execShell(StringToSend, exitCode)
Debug.Print "Result: " & result
Debug.Print "Exit Code: " & Str(exitCode)
End Sub 

上面的execShell例程与如何从Excel VBA for Mac发出HTTP GET中的例程相同。 这是该代码:

Option Explicit
' execShell() function courtesy of Robert Knight via StackOverflow
' http://stackoverflow.com/questions/6136798/vba-shell-function-in-office-2011-for-mac
Private Declare PtrSafe Function popen Lib "libc.dylib" (ByVal command As String, ByVal mode As String) As LongPtr
Private Declare PtrSafe Function pclose Lib "libc.dylib" (ByVal file As LongPtr) As Long
Private Declare PtrSafe Function fread Lib "libc.dylib" (ByVal outStr As String, ByVal size As LongPtr, ByVal items As LongPtr, ByVal stream As LongPtr) As Long
Private Declare PtrSafe Function feof Lib "libc.dylib" (ByVal file As LongPtr) As LongPtr
Function execShell(command As String, Optional ByRef exitCode As Long) As String
Dim file As LongPtr
file = popen(command, "r")
If file = 0 Then
Exit Function
End If
While feof(file) = 0
Dim chunk As String
Dim read As Long
chunk = Space(50)
read = fread(chunk, 1, Len(chunk) - 1, file)
If read > 0 Then
chunk = Left$(chunk, read)
execShell = execShell & chunk
End If
Wend
exitCode = pclose(file)
End Function
Function HTTPGet(sUrl As String, sQuery As String) As String
Dim sCmd As String
Dim sResult As String
Dim lExitCode As Long
sCmd = "curl --get -d """ & sQuery & """" & " " & sUrl
sResult = execShell(sCmd, lExitCode)
' ToDo check lExitCode
HTTPGet = sResult
End Function

考虑到问题可能出在字符串格式上,我尝试了双引号、单引号和 ascii chr(34(,但没有任何变化。 Ii还尝试了@符号的ascii。 如果我删除@,那么我确实会从服务器收到响应,但响应是"file"参数是错误的。 不知何故,文件未正确加载,即使相同的代码在终端工作。 我认为这可能是权限问题。 任何帮助,不胜感激。

部分答案。 这似乎确实是一个沙盒/权限问题。 我还没有弄清楚如何绕过沙箱(或者即使这是一个好主意,尽管应该有一些方法可以让文件夹被允许(。

但是,我发现Excel内部使用了一个文件夹,如果我在该文件夹中创建一个文件夹并将图像文件放入其中,则上述代码可以完美执行。

文件夹的路径名是"/用户/用户名/库/组容器/UBF8T346G9。办公室。 此文件夹不受导致代码失败的权限限制,我相信在每个Mac Office配置中都有。

我仍然想知道是否有办法使任何给定的文件夹被允许。

相关内容

最新更新