Công cụ dòng lệnh Linux để tải lên các tệp qua HTTP dưới dạng nhiều dữ liệu / biểu mẫu?


25

Tôi có thể thấy rằng wget có một --post-filetùy chọn, nhưng trang này nói

Wget hiện không hỗ trợ nhiều dữ liệu / biểu mẫu để truyền dữ liệu POST; chỉ ứng dụng / x-www-form-urlencoding. Chỉ một trong --post-data--post-filenên được chỉ định.

Có cách nào tương tự để tải lên các tệp trong nhiều dữ liệu / biểu mẫu không?

Câu trả lời:


31

Sử dụng curl:

curl -F "file=@localfile;filename=nameinpost" url.com

17

Chỉ có thể làm điều này với wget. Ít nhất là với phiên bản 1.13.4 và có thể những người khác. Tùy chọn --post-file cho phép bạn chỉ định một tệp để gửi, miễn là tệp postdata được xây dựng đúng.

Tôi cũng đã thử nghiệm điều này với các tệp nhị phân và nó hoạt động như mong đợi. Bạn KHÔNG cần mã hóa base64 tệp, nhưng bạn cần đảm bảo tệp của bạn không chứa ranh giới.

Lệnh tối thiểu cần thiết để thực hiện công việc này sẽ là:

wget --header="Content-type: multipart/form-data boundary=FILEUPLOAD" --post-file postfile http://domain/uploadform

và tệp postdata sẽ cần chứa một cái gì đó như:

--FILEUPLOAD
Content-Disposition: form-data; name="comment"

I love uploading files!

--FILEUPLOAD
Content-Disposition: form-data; name="uploadFile"; filename="myfile.bin"; 
Content-Type: application/octet-stream
Media Type: application/octet-stream

Give me some automated file upload action!

--FILEUPLOAD--

Một số chi tiết rất quan trọng ở đây:

  1. Các dòng trong tệp dữ liệu bài đăng được kết thúc bằng \ r \ n. Ngoại lệ duy nhất là dữ liệu bên trong bối cảnh tập tin.
  2. Mỗi thuộc tính BOUNDary trong postdata phải khớp với giá trị BOUNDary trong lệnh gọi wget. (Ví dụ về FILEUPLOAD)
  3. Tất cả các ranh giới được bắt đầu bằng hai dấu gạch nối "-" và kết thúc bằng \ r \ n
  4. Ranh giới cuối cùng được thêm hai dấu gạch nối "-" và kết thúc bằng \ r \ n
  5. Mỗi phần dữ liệu, nội dung tệp hoặc giá trị tham số, được bao quanh bởi một dòng trống "\ r \ n"

Tôi nghĩ rằng điều này có thể giúp ai đó vì một số môi trường được kiểm soát có wget nhưng không cong.


Tôi không thể có được wget để làm việc với một tệp nhị phân. Tôi đã tạo phần văn bản của tệp dữ liệu bài đăng, được lưu, sử dụng cat pic.jpg >> postdata, được tải trong Notepad ++ và nối thêm ranh giới cuối + '-' + EOL. Tham khảo W3C
Chloe

@Chloe, tôi đã phải xem lại điều này cho một dự án khác, và lần này các tệp nhị phân là cần thiết và thấy nó hoạt động như mong đợi. Tôi đã xây dựng một trang tải lên tệp php đơn giản và sau đó thực hiện thông qua trình duyệt để lấy kích thước tệp trước và sau đó so sánh với kết quả từ việc sử dụng wget. Tôi khuyên bạn nên làm như vậy vì một dòng mới đi lạc có thể khiến toàn bộ quá trình thất bại.
tu-Tái lập Monica-dor duh

1
Một dấu chấm phẩy bị thiếu. Nó gây ra sự cố với python tornado --header = "Content-type: Multipart / form-data; ranh giới = FILEUPLOAD"
FlappySocks
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.