我正在写一个API,我在上传图片时遇到了一些麻烦。
考虑:
我有一个对象,可以通过post/put/delete/get请求创建/修改/删除/查看到一个URL。当有一个文件要上传时,请求是多部分的形式,或者当只有文本要处理时,请求是application/xml。
为了处理与对象相关的图像上传,我做了如下操作:
if(isset($_FILES['userfile'])) {
$data = $this->image_model->upload_image();
if($data['error']){
$this->response(array('error' => $error['error']));
}
$xml_data = (array)simplexml_load_string( urldecode($_POST['xml']) );
$object = (array)$xml_data['object'];
} else {
$object = $this->body('object');
}
这里的主要问题是在尝试处理put请求时,显然$_POST不包含put数据(据我所知!)。
以下是我构建请求的方式,以供参考:
curl -F userfile=@./image.png -F xml="<xml><object>stuff to edit</object></xml>"
http://example.com/object -X PUT
有人知道如何访问PUT请求中的xml
变量吗?
6条答案
按热度按时间sg2wtvxw1#
首先,
$_FILES
在处理PUT请求时没有被填充,只有在处理POST请求时才被PHP填充。你需要手动解析它,这也适用于“常规”字段:
每次迭代时,
$data
数组将填充您的参数,$headers
数组将填充每个部件的标题(例如:Content-Type
等),并且$filename
将包含原始文件名(如果在请求中提供并且适用于该字段)。请注意,上述内容只适用于
multipart
内容类型。在使用上述内容解析正文之前,请确保检查请求Content-Type
标头。goucqfw62#
请不要再次删除此内容,它对大多数访问此网站的人都有帮助!所有以前的答案都是部分答案,没有像大多数问此问题的人希望的那样涵盖解决方案。
这就像上面所说的那样,还可以处理多个文件上传,并将它们放置在$_FILES中。要让它工作,你必须按照Documentation将'Script PUT/put.php'添加到项目的虚拟主机中。我还怀疑我必须设置一个cron来清理任何'.tmp'文件。
ax6ht2ek3#
使用Apiato(Laravel)框架的人群:创建一个新的中间件类文件,然后在你的laravel内核文件中的protected $middlewareGroups变量中声明这个文件(在web或API中,无论你想要什么),如下所示:
请注意:上面的代码不全是我的,有些是上面的评论,有些是我修改的。
gcuhipw94#
引用netcoder回复:“请注意,上述操作仅适用于多部分内容类型”
为了处理任何内容类型,我在netcoder先生的解决方案中添加了以下代码行:
rdlzhqv95#
我一直在试图找出如何处理这个问题,而不必打破REST的惯例和男孩howdie,什么兔子洞,让我告诉你。
我把这个添加到任何我能找到的地方,希望它能在未来帮助一些人。
我刚刚失去了一天的发展首先找出这是一个问题,然后找出问题所在。
如前所述,这不是symfony(或laravel,或任何其他框架)的问题,而是PHP的限制。
在浏览了不少php core的RFC之后,核心开发团队似乎有点抗拒实现任何与HTTP请求处理现代化有关的东西。这个问题最早在2011年被报道,看起来并没有更接近于本地解决方案。
也就是说,我设法找到了this PECL extension,名为“始终填充表单数据”。我对pecl不是很熟悉,而且似乎无法使用pear使其工作。但我使用的是CentOS和Remi PHP,其中有一个yum包。
我运行了X1 M0 N1 X,它立即修复了这个问题(我不得不重新启动我的Docker容器,但这是给定的)。
我相信还有其他不同风格的linux包,我相信任何对pear/pecl/general php扩展有更多了解的人都可以让它在windows或mac上运行,没有任何问题。
n3ipq98p6#
我知道这篇文章很老了。
但遗憾的是,PHP仍然不关注Post方法以外的表单数据。
感谢朋友们(@netcoder,@greendot,@pham-quang),他们提出了以上解决方案。
使用这些解决方案,我写了一个库的目的:
您也可以在Laravel中使用
composer require alireaza/laravel-form-data
。