【问题标题】:request parameters ordering undefined [in multipart/form-data or in general] - what to do?请求参数排序未定义 [在 multipart/form-data 或一般情况下] - 怎么办?
【发布时间】:2011-05-07 23:10:42
【问题描述】:

我正在编写一个提交表单的 Web 应用程序(其中一个字段是 mulitpart/form-data,因此显然必须使用 POST 而不是 GET,因为文件可能非常大)。其中一个字段有点事务/upload_id,另一个显然是文件内容。上传时,必须显示进度条。

众所周知,参数的顺序通常是未定义的,这意味着(文件内容/upload_id)中的任何一个都可能先出现。

是否有任何可接受/推荐的方式使浏览器发送文件内容之前发送upload_id?

这是否被认为是一个正确的实现 - 期望 upload_id 排在第一位,或者有更好/最常见/更正确的方法来处理问题?在那种情况下 - 听到一些细节会很棒。

更新:我的服务器端语言是 Java/Servlets 3.0

【问题讨论】:

  • 你的服务器端语言是什么?
  • 感谢提问 - 刚刚更新了问题:我的服务器端语言是 Java/Servlets 3.0
  • 试图提前考虑并认为对于一个简单的情况(每个会话一次只有一个文件)-upload_id 是不必要的。有几个文件的情况看起来它们被认为是一个大的单个块,应该一起跟踪,因此 upload_id 再次是不必要的。需要考虑更多...
  • 是的,想多了 - 如果网页上有多个提交表单,则该问题有效。
  • 添加了一个答案。如果页面上有多个表单,则只有 提交的 表单的内容将作为多部分传入。无论如何,您不必担心物品的发送顺序。使用高级工具来完成这项工作,或者根据需要编写一个。

标签: javascript httpwebrequest multipartform-data web-application-design


【解决方案1】:

好吧,更好的答案(不使用过滤器)是将 upload_id(s) 作为 URL 的一部分(在“?”之后)发布,即使在发出 POST 请求时也是如此。在这种情况下,它们将始终在文件内容之前处理。

【讨论】:

    【解决方案2】:

    也使用 servlet,在我的情况下,我想在开始流式传输文件之前在我的 servlet 中运行我的 CSRF 过滤器:如果过滤器失败,我可以在上传 20gb 视频文件之前终止请求,如与默认的 PHP 实现相反,服务器仅在解析整个请求后才访问您的脚本。

    这对我来说有点小题大做,但在某些情况下,我不得不这样做,我作弊并将非文件请求参数放入 URL 中,并且在每种情况下(几乎使用我测试过的每个浏览器)在服务器上的请求参数上的迭代器(我在流模式下使用 commons fileupload)在接收文件数据之前首先接收到非文件请求参数。有点脆弱,但并非不可行。

    我假设如果您以文件 <input> 作为最后一项来订购请求参数,您将获得相同的行为。

    【讨论】:

      【解决方案3】:

      您不必担心参数的发送顺序。如果是这样,那么您的服务器端代码非常脆弱。

      一个多部分请求将包含传入的每个表单字段的字段名称。使用该名称来引用该字段,无论其发送顺序如何。

      如果您是手动解析帖子正文,我建议您查看现有项目,如 Apache FileUpload 将其抽象出来。

      【讨论】:

      • 好吧,我确实意识到一些工具提供了一些有用的抽象,这次我有点好奇它是如何实现的——是的,可能查看源代码是唯一的方法。从技术上讲,当表单字段在 HTTP 响应的正文中完全序列化时——那么它们将被序列化——这意味着如果一个大文件首先出现,那么它的 upload_id 只会在之后出现。这带来了一些问题,我对技术解决方案有点好奇,只是想从中学习。
      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2021-10-11
      相关资源
      最近更新 更多