服务器端的多部分消息和POST参数

时间:2011-12-23 12:21:16

标签: http client-server multipart

我正在尝试在多部分邮件中发布文件。问题是我需要传递两个额外的参数与该文件。我希望它们可以在POST参数数组中访问。问题是是否可以将部分添加到多部分消息,以便它将被解释为POST参数?还是我在浪费时间?

我想要那样的:

--1BEF0A57BE110FD467A\r\n
Content-Disposition: form-data; name="name1"\r\n
\r\n
value\r\n

$_POST['name1']

密切相关

PS:据我所知,如果上传带有动作脚本FileReference.upload(urlRequest)的文件并指定urlRequest中的帖子参数,那么它们将会在$_POST

1 个答案:

答案 0 :(得分:3)

您要做的事实上就是多部分消息与$_POST数组相关的工作方式。

考虑以下HTML表单:

<form action="/somefile.php" method="post" enctype="multipart/form-data">
  <input name="text1" type="text" />
  <input name="text2" type="text" />
  <input name="text3" type="text" />
  <input name="file" type="file" />
  <input type="submit" />
</form>

现在我们假设我们使用value1value2value3填充三个文字输入,我们选择一个名为file.txt的文件,然后按提交。这将导致请求看起来像这样:

POST /somefile.php HTTP/1.1
Host: somehost.com
Accept: */*
User-Agent: MyBrowser/1.0
Content-Type: multipart/form-data; boundary="this-is-a-boundary-string"

--this-is-a-boundary-string
Content-Dispostion: form-data; name="text1"

value1
--this-is-a-boundary-string
Content-Dispostion: form-data; name="text2"

value2
--this-is-a-boundary-string
Content-Dispostion: form-data; name="text3"

value3
--this-is-a-boundary-string
Content-Dispostion: form-data; name="file"; filename="file.txt"
Content-Type: text/plain

This is the contents of file.txt
--this-is-a-boundary-string--

当我们在PHP中查看它时,如果我们print_r($_POST);我们应该得到这样的结果:

Array
(
   [text1] => value1
   [text2] => value2
   [text3] => value3
)

...如果我们print_r($_FILES);

Array
(
   [file] => Array
   (
      [name] => file.txt
      [type] => text/plain
      [size] => 32
      [tmp_name] => /tmp/dskhfwe43232.tmp
      [error] => 0
   )
)

...所以你可以看到,Content-Disposition:标题中不包含filename=""元素的消息部分被添加到$_POST数组中,而那些包含{作为文件上传处理并添加到$_FILES

在构建要发送到服务器的multipart/form-data消息时,我发现构建您正在模仿请求的HTML表单最容易,并根据HTML表单的行为方式构建HTTP消息。 / p>