bash 使用 curl 发布二进制数据

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9134003/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 21:37:27  来源:igfitidea点击:

Binary Data Posting with curl

bashpostcurldotnetnukebinary-data

提问by gavenkoa

So basically, I'm trying to write a series of scripts to interact with Dot Net Nuke. I've been analysing the traffic and can now login and do some basic tasks. However, I've never handled binary file upload with curl. Would someone be willing to look at this to help me out? Here's the anatomy of the request:

所以基本上,我正在尝试编写一系列脚本来与 Dot Net Nuke 进行交互。我一直在分析流量,现在可以登录并执行一些基本任务。但是,我从来没有用 curl 处理过二进制文件上传。有人愿意看看这个来帮助我吗?这是请求的剖析:

http://pastebin.com/qU8ZEMaQ

http://pastebin.com/qU8ZEMaQ

Here's what I've got for curl so far:

到目前为止,这是我对 curl 的了解:

http://pastebin.com/LG2ubFZG

http://pastebin.com/LG2ubFZG

edit: For the lazy -

编辑:对于懒人 -

length of the file is achieved and stored in LENGTH
STUFF is just a copy/paste of the request URL with parameters, minus the URL itself.

文件的长度被实现并存储在 LENGTH
STUFF 中只是带有参数的请求 URL 的复制/粘贴,减去 URL 本身。

curl -L --cookie ~/.cms --data-binary "@background.jpg" \
--header "Content-Length: $LENGTH" \
--header "Content-Disposition: form-data" \
--header "name=\"RadFileExplorer1_upload1file0\"" \
--header "Content-Type: image/jpg" \
--header "Filename=\"background.jpg\"" \
--data $STUFF \
--referer "Kept-Secret" \
"Kept-Secret"

回答by gavenkoa

You don't need --header "Content-Length: $LENGTH".

您不需要--header "Content-Length: $LENGTH"

curl --request POST --data-binary "@template_entry.xml" $URL

Note that GET request does not support content body widely.

请注意,GET 请求不广泛支持内容正文。

Also remember that POST request have 2 different coding schema. This is first form:

还要记住 POST 请求有 2 种不同的编码模式。这是第一种形式:

  $ nc -l -p 6666 &
  $ curl  --request POST --data-binary "@README" http://localhost:6666

POST / HTTP/1.1
User-Agent: curl/7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6
Host: localhost:6666
Accept: */*
Content-Length: 9309
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

.. -*- mode: rst; coding: cp1251; fill-column: 80 -*-
.. rst2html.py README README.html
.. contents::

You probably request this:

你可能会这样要求:

-F/--form name=content
           (HTTP) This lets curl emulate a filled-in form in
              which a user has pressed the submit button. This
              causes curl to POST data using the Content- Type
              multipart/form-data according to RFC2388. This
              enables uploading of binary files etc. To force the
              'content' part to be a file, prefix the file name
              with an @ sign. To just get the content part from a
              file, prefix the file name with the symbol <. The
              difference between @ and < is then that @ makes a
              file get attached in the post as a file upload,
              while the < makes a text field and just get the
              contents for that text field from a file.