CURL - Powershell:调用-RestMethod 到 GLPI API:上传文档

如何解决CURL - Powershell:调用-RestMethod 到 GLPI API:上传文档

我想从 API 上传文件到我的 GLPI。

这个 curl 命令工作正常:

curl -X POST 
-H 'Content-Type: multipart/form-data'
-H 'Session-Token: $sessiontoken' 
-H 'App-Token:$apptoken' 
-F 'uploadManifest={"input": {"name": "Uploaded document","_filename" : ["file.txt"]}};type=application/json' 
-F 'filename[0]=@file.txt' 'http://GLPI_SERVER/glpi/apirest.PHP/Document'

powershell 中的相同 curl(感谢来自 GLPI 的 Jean-Christophe):

$DocumentUpload = C:\curl\bin\curl.exe `
-X POST `
-H 'Content-Type: multipart/form-data' `
-H "Session-Token: $($SessionToken.session_token)" `
-H 'App-Token: '$AppToken `
 -F 'uploadManifest={\"input\": {\"name\": \"Document ticket 161\",\"_filename\" : [\"clear.png\"],\"tickets_id\":\"161\"}};type=application/json' `
-F 'filename[0]=@"C:\temp1\clear.png"' `
-s `
-k 'https://glpi.xxxx.fr/apirest.PHP/Document/'

我想使用 Invoke-RestMethod 但没有成功

# GLPI REST API CONfig :
$AppURL =     "https://glpi.xxxxxxxxxxxx.fr/apirest.PHP"
$UserToken = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
$AppToken =   "XXXXXXXXXXX"

$ID = 161
$ItemType = "Ticket"
$SubItemType = "Document"
$manifest = @{}

$SessionToken = Invoke-RestMethod "$AppURL/initSession" -Method Get -Headers @{"Content-Type" = "application/json";"Authorization" = "user_token $UserToken";"App-Token"=$AppToken}

$FileContent = [System.IO.File]::ReadAllBytes("C:\temp1\clear.png")

$input = New-Object System.Collections.ArrayList
$type =New-Object System.Collections.ArrayList
$filename =New-Object System.Collections.ArrayList

$input = @{input=@{"name"="titre";"_filename"="clear.png";"tickets_id"="161"}}
$type = @{"type"="application/json"}
$filename =@{"filename[0]"="C:\temp1\clear.png"}

$manifest.Add("uploadManifest",$input)
$manifest.Add("type=","application/json")
$manifest.Add("filename[0]=",@("C:\temp1\clear.png"))

$json = @($manifest | ConvertTo-Json)
#display Convert to JSON
#$json


Invoke-RestMethod "$AppURL/$($ItemType)/$($ID)/$($SubItemType)" -Method Post -Headers @{"session-token"=$SessionToken.session_token; "App-Token" = $AppToken} -Body ([System.Text.Encoding]::UTF8.GetBytes($json)) -ContentType 'multipart/data'
      
## Test autre ContentType  

Invoke-RestMethod "$AppURL/$($ItemType)/$($ID)/$($SubItemType)" -Method Post -Headers @{"session-token"=$SessionToken.session_token; "App-Token" = $AppToken} -Body ([System.Text.Encoding]::UTF8.GetBytes($json)) -ContentType 'multipart/form-data'

#Kill session
Invoke-RestMethod "$AppURL/killSession" -Headers @{"session-token"=$SessionToken.session_token; "App-Token" = "$AppToken"}

Invoke with : -ContentType 'multipart/data'

["ERROR_BAD_ARRAY","The input parameter must be an array of objects

Invoke with : -ContentType 'multipart/form-data'

["ERROR_UPLOAD_FILE_TOO_BIG_POST_MAX_SIZE","The file seems too big"]

如果有人看到我的错误并帮助我,我预先感谢。

主题How convert curl file upload command to Invoke-RestMethod?

解决方法

  1. 在 chrome 中按 f12 打开 devtools,转到网络选项卡(可能也是启用 XHR 过滤器的好主意)
  2. 手动上传文件 - 新请求将显示在 devtools 中
  3. 找到上传文件的那个
  4. 右键单击 - 复制 - 作为 powershell

这将复制整个请求,然后您可以对其进行调整/审查以更好地了解哪些内容发生在何处

,

感谢您的回答 Charg,但是当我尝试时,有很多变化和页面。我在这里发帖之前尝试过这个选项:D。因为对我来说副本是不可用的。也许对你来说最简单:

我必须创建一个新回复,因为该评论不允许使用足够多的字符。

(我删除了标题)

<main class="video-main">
    <h2>Video</h2>
      <div class="dropdown">
        <button class="dropbtn">Filter Projects</button>
        <ul class="dropdown-content">
            <li class="filter-list-item" id="all" onclick="showAll()">All Items</li>
            <li class="filter-list-item" onclick="showCategory('category-nike')">Nike</li>
            <li class="filter-list-item" onclick="showCategory('category-BSpace')">BlankSpace</li>
            <li class="filter-list-item" onclick="showCategory('category-AfterEff')">After Effects</li>
            <li class="filter-list-item" onclick="showCategory('category-vegan')">Vegan</li>
          </ul>
      </div>
    <div class="video-boxes">
      <div class="item category-nike">
        <video src="" controls></video>
        <h4 class="video-title">Nike</h4>
      </div>
      <div class="item category-BSpace">
        <video src="" controls></video>
        <h4 class="video-title">Blankspace</h4>
      </div>
       <div class="item category-AfterEff">
        <video src="" controls></video>
        <h4 class="video-title">Logo Animation</h4>
      </div>
      <div class="item category-vegan">
        <video src="" controls></video>
        <h4 class="video-title">Vegan</h4>
      </div>
     </div>
    </main>

和其他机构(更多信息):

Invoke-WebRequest -Uri "https://glpi.XXXXXXXXXXXX.fr/ajax/fileupload.php" `
-Method "POST" `
-Headers @{

} `
-ContentType "multipart/form-data; boundary=----WebKitFormBoundarysgETZNBiXoMdeht2Q" `
-Body ([System.Text.Encoding]::UTF8.GetBytes("------WebKitFormBoundarysgETZNBiXoMdeht2Q$([char]13)$([char]10)Content-Disposition: form-data; name=`"name`"$([char]13)$([char]10)$([char]13)$([char]10)filename$([char]13)$([char]10)------WebKitFormBoundarysgETZNBiXoMeht2Q$([char]13)$([char]10)Content-Disposition: form-data; name=`"showfilesize`"$([char]13)$([char]10)$([char]13)$([char]10)1$([char]13)$([char]10)------WebKitFormBoundarysgETZNBiXoMeht2Q$([char]13)$([char]10)Content-Disposition: form-data; name=`"filename[]`"; filename=`"apple.png`"$([char]13)$([char]10)Content-Type: image/png$([char]13)$([char]10)$([char]13)$([char]10)$([char]13)$([char]10)------WebKitFormBoundarysgETZNBiXoMeht2Q--$([char]13)$([char]10)"))

我找到了一个人,他用 Python 编写了这部分(也许有助于转换为 powershell?)

-Body ([System.Text.Encoding]::UTF8.GetBytes("------WebKitFormBoundarymPxXKSWBW70lLtX2 $([char]13)$([char]10)Content-Disposition: form-data; name=`"documentcategories_id`"$([char]13)$([char]10)$([char]13)$([char]10)10$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"entities_id`"$([char]13)$([char]10)$([char]13)$([char]10)2$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"is_recursive`"$([char]13)$([char]10)$([char]13)$([char]10)0$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"itemtype`"$([char]13)$([char]10)$([char]13)$([char]10)Ticket$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"items_id`"$([char]13)$([char]10)$([char]13)$([char]10)161$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"tickets_id`"$([char]13)$([char]10)$([char]13)$([char]10)161$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"_filename[0]`"$([char]13)$([char]10)$([char]13)$([char]10)6075d0cb639f08.69946676apple.png$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"_prefix_filename[0]`"$([char]13)$([char]10)$([char]13)$([char]10)6075d0cb639f08.69946676$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"_tag_filename[0]`"$([char]13)$([char]10)$([char]13)$([char]10)ea6f951c-f37490bd-6075d0cb7fc703.58112843$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"filename[]`"; filename=`"`"$([char]13)$([char]10)Content-Type: application/octet-stream$([char]13)$([char]10)$([char]13)$([char]10)$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"add`"$([char]13)$([char]10)$([char]13)$([char]10)Ajouter un nouveau fichier$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2$([char]13)$([char]10)Content-Disposition: form-data; name=`"_glpi_csrf_token`"$([char]13)$([char]10)$([char]13)$([char]10)583040be8c019c6b482ff61d4c6c37230109cb37876001d086603c1b4a144eb0$([char]13)$([char]10)------WebKitFormBoundarymPxXKSWBW70lLtX2--$([char]13)$([char]10)"))

另外一个人在 C# 中找到了他的解决方案(我丢失了帖子 ID)

multipart_form_data = {
    'uploadManifest': (None,'{"input": {"name": "test123.png","_filename": ["test123.png"]}}'),'file': ('test123.png',open('test123.png','rb')),}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?