在播放框架中上传表单错误 413 请求实体太大

Posted

技术标签:

【中文标题】在播放框架中上传表单错误 413 请求实体太大【英文标题】:Upload Form in playframework error 413 request entity to large 【发布时间】:2016-01-30 21:54:07 【问题描述】:

这也是他的控制器动作,我可以使这个异步(只是好奇)吗?

def upload = Action(parse.multipartFormData)  request => 
    request.body.file("picture").map  picture =>
        import java.io.File
        val filename = picture.filename 
        val contentType = picture.contentType
        picture.ref.moveTo(new File("/tmp/picture"))
        Ok("File uploaded")
      .getOrElse 
        Redirect(routes.Application.index).flashing(
          "error" -> "Missing file"
        )
      
  

路线

GET     /admin/carro/upload         controllers.AdminCarro.upload

模板

@import helper._


@main(new Main("Car Dealers", "Compra e venda de carros", "logo.png", "carro, compra, venda")) 
    <div class="container">
    @form(routes.AdminCarro.upload, 'enctype -> "multipart/form-data") 

        <input type="file" name="picture">

        <p>
            <input type="submit">
        </p>

    
    </div>

这个 413 请求实体在没有发送任何文件或呈现任何内容的情况下发生。

【问题讨论】:

什么时候发生?您是否在没有文件的情况下向/admin/carro/upload 发送请求? 是的。这只是一个简单的请求来呈现页面表单,并没有显示只返回 413 错误。 【参考方案1】:

我不确定您这样做是为了达到什么目的。为什么不使用 GET 呈现视图并使用 POST 呈现上传:

def uploadView = Action.async  request => 
   Future.successful(Ok(views.html.uploadForm))


def upload = Action(parse.multipartFormData).async  request => 
    request.body.file("picture").map  picture =>
        import java.io.File
        val filename = picture.filename 
        val contentType = picture.contentType
        picture.ref.moveTo(new File("/tmp/picture"))
        Future.successful(Ok("File uploaded"))
      .getOrElse 
        Future.successful(Redirect(routes.Application.index).flashing(
          "error" -> "Missing file"
        ))
      
  

还有路由文件:

  GET     /admin/carro/upload         controllers.AdminCarro.uploadView
  POST    /admin/carro/upload         controllers.AdminCarro.upload

此外,如果您要上传大文件,您可以为所有解析器指定 max Sixe:

parsers.text.maxLength=5242880

为了行动

Action(parse.text(maxLength = 1024 * 10))

【讨论】:

我习惯了 php,我可以在同一个 REQUEST 中简单地将 POST 与 GET 请求分开,而且没有问题。 :\ 好奇这对于 Java 和 JavaServlets 是否相同? 这不是一个错误,它是一个特性;)虽然在 PHP 请求方法中可以混合使用,但不建议这样做,因为它会损害安全性。事实上的开发人员应该期望每个请求都有精确的方法,这就是 Play 的工作方式(对于一个实例应用程序,如果没有定义 POST 路由,则返回 404,而不是 forwarding 它到 GET) 出于品味,我更喜欢更安全的方法。在以前版本的 Play(分支 1.x)中存在一个通配符方法 *(星号),它代表 any 方法,无论如何,以安全的名义,它在 Play 中被避免2.x

以上是关于在播放框架中上传表单错误 413 请求实体太大的主要内容,如果未能解决你的问题,请参考以下文章

413 请求实体太大 + Web 服务器连接已关闭 |错误 64

防止 ASP.NET 中的 413 错误请求实体太大 [重复]

如何修复 Node.js 中的“413 请求实体太大”错误

(413) 使用 WCF 请求实体太大错误

错误413请求实体过大

(413) 请求实体太大 - 在 Azure 上上传 Wcf 时