วิธีการส่งเนื้อหาไฟล์เป็นนิติบุคคลโดยใช้ cURL


207

ฉันใช้ยูทิลิตี้บรรทัดคำสั่ง cURL เพื่อส่ง HTTP POST ไปยังบริการเว็บ ฉันต้องการรวมเนื้อหาของไฟล์เป็นเอนทิตีร่างกายของ POST ฉันได้ลองใช้-d </path/to/filename>รวมทั้งตัวแปรอื่น ๆ ที่มีข้อมูลประเภทเช่น--data </path/to/filename> --data-urlencode </path/to/filename>ฯลฯ ... ไฟล์ถูกแนบไว้เสมอ ฉันต้องการมันเป็นเอนทิตี้ของร่างกาย

คำตอบ:


338

ฉันเชื่อว่าคุณกำลังมองหา@filenameไวยากรณ์เช่น:

ตัดเส้นบรรทัดใหม่

curl --data "@/path/to/filename" http://...

ขึ้นบรรทัดใหม่

curl --data-binary "@/path/to/filename" http://...

=====

curl จะตัดการขึ้นบรรทัดใหม่ทั้งหมดจากไฟล์ หากคุณต้องการส่งไฟล์ที่มีการขึ้นบรรทัดใหม่เหมือนเดิมให้ใช้--data-binaryแทน --data


21
หากคุณต้องการเป็นแฟนซีที่แท้จริงคุณสามารถทำได้: cat file.txt | curl --data "@-" `(< url.txt )` @-บอก curl ให้อ่านจาก stdin คุณสามารถใช้การเปลี่ยนเส้นทาง(< x.txt )เพื่อใส่อะไรก็ได้ที่คุณต้องการ หากคุณใช้ทุบตี
Breedly

62
curl จะตัดการขึ้นบรรทัดใหม่ทั้งหมดจากไฟล์ หากคุณต้องการที่จะส่งไฟล์ที่มีการขึ้นบรรทัดใหม่เหมือนเดิมใช้งานในสถานที่ของ--data-binary --data
คริส

ตอนนี้เราจะเพิ่มข้อมูลรับรองการเข้าสู่ระบบเพื่ออนุมัติคำขอนี้ได้อย่างไร
anon58192932

@ anon58192932 - ขึ้นอยู่กับโปรโตคอลความปลอดภัยของเซิร์ฟเวอร์ หากคุณใช้name:valueคู่เช่นชื่อผู้ใช้และรหัสผ่านให้เพิ่มส่วนหัวที่จำเป็นที่ตรงกับสิ่งที่บริการคาดหวัง: --header: "<header_name>:<header_value>"เป็นสตริงเดียว
Roy Hinkley

19

ฉันรู้ว่าตอบคำถามแล้ว แต่ในกรณีของฉันฉันพยายามส่งเนื้อหาของไฟล์ข้อความไปยังSlack Webhook api และด้วยเหตุผลบางอย่างคำตอบข้างต้นไม่ได้ผล อะไรก็ตามนี่คือสิ่งที่ในที่สุดก็ทำเคล็ดลับสำหรับฉัน:

curl -X POST -H --silent --data-urlencode "payload={\"text\": \"$(cat file.txt | sed "s/\"/'/g")\"}" https://hooks.slack.com/services/XXX

อันนี้ไม่แปลงจุดเป็นขีดล่าง (. -> _) และเก็บบรรทัดใหม่ ขอบคุณ!
Ramon Fincken

1
มันเจ๋ง แต่ก็ไม่ได้ตอบคำถามเพราะไฟล์ถูกระเบิดในบรรทัดคำสั่งแทนที่จะระบุเป็น curl ฉันยังสงสัยด้วยว่าอักขระพิเศษทั้งหมดของเชลล์จำเป็นต้องหลบหนีหรือไม่ - แต่ฉันไม่รู้มากพอเกี่ยวกับเรื่องนั้น;)
เจอราร์ดโอนีล

ขอบคุณคุณช่วยชีวิตฉันไว้!
aryswisnu

สำหรับไฟล์เนื้อหาขนาดใหญ่ curl ด้านบนจะไม่ทำงานcurl: argument list too longในกรณีที่คำตอบที่ยอมรับคือการช่วยชีวิตcurl --data "@/path/to/filename" http://...
coder อีกคนที่

0

ในกรณีของฉัน@ทำให้เกิดปัญหาการเข้ารหัสฉันยังคงชอบแบบเดิมอยู่:

curl -d "$(cat /path/to/file)" https://example.com
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.