2011-09-26 48 views
8

Nếu tôi thiết lập một trang html với các hình thức sau đây:Gửi một tập tin qua POST sử dụng HTTP thô (Putty)

<html> 
<body> 

<form action="upload_file.php" method="post" 
enctype="multipart/form-data"> 
<label for="file">Filename:</label> 
<input type="file" name="file" id="file" /> 
<br /> 
<input type="submit" name="submit" value="Submit" /> 
</form> 

</body> 
</html> 

tôi có thể tải lên một tập tin để upload_file.php nơi tôi có thể xử lý nó bằng cách sử dụng php kịch bản.

Với mục đích thử nghiệm, tôi cần thực hiện tương tự bằng cách sử dụng HTTP thô thông qua phiên Putty.

tôi có thể làm một POST bình thường (chỉ cần gửi dữ liệu văn bản) theo cách này:

POST /test_post.php HTTP/1.1 
Host: example.com 
User-Agent: Mozilla/5.0 
Connection: keep-alive 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 11 

name=myname 

Làm thế nào tôi có thể gửi một tập tin theo cách này?

Trả lời

14

Bạn phải sử dụng multipart content-type và mã hóa các tập tin dữ liệu vào hex/nhị phân

Hãy thử như sau trong telnet:

POST /the_url HTTP/1.1 
User-Agent: Mozilla 
Host: www.example.com 
Content-Length: xxxx 
Content-Type: multipart/form-data; boundary=--------------------31063722920652 
------------------------------31063722920652 
Content-Disposition: form-data; name="a" 

value_for_a 
------------------------------31063722920652 
Content-Disposition: form-data; name="b" 

value_for_b 
------------------------------31063722920652 
Content-Disposition: form-data; name="c"; filename="myfile.txt" 
Content-Type: text/plain 

      This is a test 
      and more 

-----------------------------31063722920652 
Content-Disposition: form-data; name="submit" 

Submit 
-----------------------------31063722920652-- 

Hãy nhớ rằng một newline thêm là cần thiết giữa tên trường và nó dữ liệu. Ngoài ra, hãy cập nhật giá trị Content-Length.

+0

Làm cách nào để chứa tệp trong thời lượng nội dung mới? Nó sẽ là kích thước của tập tin theo byte? – xbonez

+1

Tôi đã hoàn tất dữ liệu thô trong câu trả lời của mình. Nó bây giờ chứa một tải trọng tập tin văn bản. Độ dài nội dung sẽ là kích thước đầy đủ của tải trọng (bao gồm tệp) theo byte –

+0

Độ dài nội dung là kích thước tính theo byte dữ liệu được gửi bắt đầu từ 'giới hạn' đầu tiên cho đến lần cuối cùng. –

4

mở một cổng với netcat và lưu các yêu cầu đầu vào:

nc -l -p 1090 > income-http.txt 

Sau đó, thay đổi hình thức của bạn để gửi dữ liệu đến netcat:

<form action="http://localhost:1090/upload_file.php" 
    method="post" enctype="multipart/form-data"> 

Gửi dưới dạng từ trình duyệt của bạn. Bạn có thể tìm thấy yêu cầu thô đầy đủ với nội dung của tệp trong tệp income-http.txt.

Tiết kiệm income-http.txt là hoạt động một lần. Sau đó, bạn có thể gửi yêu cầu đã lưu ra bất kỳ lúc nào. Xin lưu ý rằng bạn nên chỉnh sửa tiêu đề Host: trong txt đã lưu.

+0

Tôi thực sự thích ý tưởng có thể phân tích yêu cầu đến. Nhưng thật không may, việc mở một cổng không phải là một lựa chọn cho tôi. Có cách nào khác không? – xbonez

+1

Bạn phải làm điều đó ngay trên máy địa phương của bạn và chỉ một lần. Sau khi bạn nhận được thu nhập-http.txt, bạn có thể gửi nó bất kỳ lúc nào. – palacsint

+0

Ồ, bạn có nghĩa là tôi mở cổng trên máy cục bộ và không phải chuyển tiếp nó tại bộ định tuyến? Tôi không có quyền truy cập vào bộ định tuyến. Tôi sẽ cung cấp cho một shot netcat. – xbonez

Các vấn đề liên quan