2011-09-26 42 views
8

通过POST发送文件。如果我成立了一个HTML页面的格式如下:使用原始HTTP(腻子)

<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> 

我可以将文件上传到upload_file.php在那里我可以使用PHP处理它脚本。

出于测试目的,我需要通过Putty会话使用原始HTTP执行相同的操作。

我可以做一个正常的POST(只是发送文本数据)这样说:

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 

我怎么能发送这样一个文件?

回答

14

你必须使用multipart内容类型和文件数据编码为十六进制/二进制

尝试在远程登录如下:

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-- 

记住额外的换行符是字段名之间必要的数据。另外,更新Content-Length值。与netcat的

+0

如何容纳新内容长度中的文件?它是以字节为单位的文件大小吗? – xbonez

+1

我已经完成了我答案中的原始数据。它现在包含一个文本文件有效载荷。 Content-Length是以字节为单位的有效负载(包括文件)的完整大小。 –

+0

Content-Length是从第一个“边界”开始直到最后一个的数据的大小(以字节为单位)。 –

4

打开一个端口,并保存传入的请求:

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

然后修改您的形式将数据发送到netcat的:

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

从浏览器提交表单。您可以在income-http.txt文件中找到文件内容的完整原始请求。

保存income-http.txt是一次性活动。稍后,您可以随时发送保存的请求。请注意,您应该在保存的txt中编辑Host:标题。

+0

我真的很喜欢能够分析传入请求的想法。但不幸的是,开放港口不是我的选择。有没有其他选择? – xbonez

+1

你必须在你的本地机器上只做一次。获得收入-http.txt后,您可以随时发送。 – palacsint

+0

噢,你的意思是我打开本地机器上的端口,不必在路由器上转发它?我无法访问路由器。我会给netcat一个镜头。 – xbonez