Cách gửi nội dung tệp dưới dạng thực thể bằng cURL


207

Tôi đang sử dụng tiện ích dòng lệnh cURL để gửi HTTP POST đến một dịch vụ web. Tôi muốn bao gồm nội dung của tệp dưới dạng thực thể cơ thể của POST. Tôi đã thử sử dụng -d </path/to/filename>cũng như các biến thể khác với thông tin loại như --data </path/to/filename> --data-urlencode </path/to/filename>vv ... tập tin luôn được đính kèm. Tôi cần nó như là thực thể cơ thể.

Câu trả lời:


338

Tôi tin rằng bạn đang tìm kiếm @filenamecú pháp, ví dụ:

tước dòng mới

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

giữ dòng mới

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

=====

curl sẽ loại bỏ tất cả các dòng mới từ các tập tin. Nếu bạn muốn gửi tệp có dòng mới nguyên vẹn, hãy sử dụng --data-binarythay cho --data


21
Nếu bạn muốn trở nên thực sự ưa thích, bạn có thể làm: cat file.txt | curl --data "@-" `(< url.txt )` @-bảo curl đọc từ stdin. Bạn cũng có thể chỉ cần sử dụng chuyển hướng (< x.txt )để đưa vào bất cứ điều gì bạn muốn. Nếu bạn đang sử dụng bash.
Nhân giống

62
curl sẽ loại bỏ tất cả các dòng mới từ các tập tin. Nếu bạn muốn gửi tệp với dòng mới nguyên vẹn, hãy sử dụng --data-binarythay thế --data.
Chris

bây giờ làm thế nào để thêm thông tin đăng nhập để cho phép yêu cầu này?
anon58192932

@ anon58192932 - Điều đó phụ thuộc vào giao thức bảo mật của máy chủ. Nếu bạn đang sử dụng name:valuecác cặp, như tên người dùng và mật khẩu, sau đó thêm các tiêu đề cần thiết phù hợp với những gì dịch vụ đang mong đợi: --header: "<header_name>:<header_value>"dưới dạng một chuỗi.
Roy Hinkley

19

Tôi biết câu hỏi đã được trả lời, nhưng trong trường hợp của tôi, tôi đã cố gắng gửi nội dung của tệp văn bản đến api Slack Webhook và vì một số lý do, câu trả lời trên không hoạt động. Dù sao đi nữa, đây là điều cuối cùng đã làm cho tôi:

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

Cái này không chuyển đổi dấu chấm thành dấu gạch dưới (. -> _) và giữ dòng mới. Cảm ơn!
Ramon Fincken

1
Thật tuyệt, nhưng nó không trả lời câu hỏi vì tệp được phát nổ trên dòng lệnh thay vì được chỉ định cho curl. Tôi cũng tự hỏi liệu tất cả các nhân vật đặc biệt của vỏ có cần phải trốn thoát hay không - nhưng tôi không biết đủ về điều đó;)
Gerard ONeill

Cảm ơn, bạn đã cứu cuộc đời tôi!
aryswisnu

Đối với một tệp nội dung khổng lồ, trên curl sẽ không hoạt động, curl: argument list too longtrong trường hợp đó câu trả lời được chấp nhận là trình bảo vệ cuộc sốngcurl --data "@/path/to/filename" http://...
Một lập trình viên khác
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.