【问题标题】:Symfony REST file upload over PUT methodSymfony REST 文件通过 PUT 方法上传
【发布时间】:2014-06-24 11:19:49
【问题描述】:

我有一个 REST 服务,我想通过 PUT 更新文件。 当我使用 POST 时,我使用以下内容获取上传的文件:

/**
 * @var Request $request
 */
$request->files->get('file');

如何在 Symfony 框架中将上传的文件作为 PUT 发送?

【问题讨论】:

  • 您使用特定的 REST 包吗?好吧,我的错我没有看到 FOSRestBundle 标签。我写了this 来上传图片,但它可以是文件的相同逻辑。
  • 我确实测试过,但在$request->getContent() 中更多的是因为文件的内容还有一些标题信息,然后上传的图像已损坏
  • 我也在寻找如何处理这个问题的正确答案。实际上,我可以使用以下命令读取文件:var_dump(file_get_contents('php://input')),但我无法将其转换为正确的Symfony\Component\HttpFoundation\File\File 类。这是我真正想要实现的。有什么新想法吗?
  • 将内容保存到 tmpfile 例如使用 tempnam 并创建一个新的 File($path) Symfony 文件是基于 SplFileInfo

标签: php rest symfony fosrestbundle


【解决方案1】:

当您收到一个 POST 请求时,您会收到一个包含一个或多个字段的表单,这些字段包括任何文件(可能不止一个文件)。 Content-Typemultipart/form-data

当您 PUT 文件时,文件的数据 请求正文。这与使用 GET 下载文件相反,其中文件的内容是响应正文。在这种情况下,如果您通过 PUT 请求收到 JPG 文件,则 Content-Type 将是 image/jpeg。当然,这意味着每个 PUT 请求只能提交一个文件。

因此,您应该使用$request->getContent() 来接收数据。如果内容除了提交的文件之外还有其他信息,那么从技术上讲,它是一个格式错误的 PUT 请求,应该以 POST 的形式发送。

虽然您不能通过 PUT 请求发送任何其他字段,但您仍然可以使用查询字符串在适当的情况下提供一些额外的短字段。例如,您可以通过 PUT 请求将文件上传到/api/record/123/attachment?filename=example.pdf。这将允许您接收上传的文件、另一个数据字段(文件名)和记录的 ID (123) 以附加上传。

【讨论】:

    【解决方案2】:

    无需更改 api 的最简单方法是将要更改的文件和数据提交为方法 POST 并将查询参数 ?_method=PUT 添加到 url。在您的前端控制器app.php/index.php 中,您需要启用此功能:

    Request::enableHttpMethodParameterOverride();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-22
      • 2019-05-09
      • 2016-04-18
      • 2021-12-16
      • 2016-12-01
      • 2012-03-03
      • 1970-01-01
      • 2021-03-08
      相关资源
      最近更新 更多