【问题标题】:Use `enctype="multipart/form-data"` always or never?总是或从不使用`enctype="multipart/form-data"`?
【发布时间】:2017-12-17 01:33:06
【问题描述】:

我想写一个通用的html模板。

我知道过去你需要在<form>标签中设置enctype="multipart/form-data",如果你想上传文件。

我想在我的通用模板中避免这种情况。

我该怎么办?我看到了这些解决方案:

  • 始终使用enctype="multipart/form-data"
  • 永远不要使用enctype="multipart/form-data"

背景:我很幸运,我不需要支持旧的浏览器。我不需要支持 IE9 或更早的版本。

它正在工作

几个月以来,我们一直在以各种形式使用enctype="multipart/form-data"(即使没有要上传的文件)。

它有效。这使我们的模板更简单。对我来说,这是实现“无条件代码”这一大目标的一个简单步骤。

【问题讨论】:

  • 使用它总是没有坏处。
  • @Mr.Alien 使用它总是没有害处。好的。现代网络浏览器还需要它吗?
  • 我认为是的.. 很久以来没有使用表单上传,但提到 multipart/form-data 明确指出您有一个文件上传字段。可以将其想象为具有可选表单上传的网站,但即使未提供文件..属性仍保持原样。因此,在所有表单上定义它并没有什么坏处。

标签: html forms file-upload browser


【解决方案1】:

我认为您应该选择始终使用 enctype="multipart/form-data"。。由于它能够发送任何数据类型。但是由于您无需管理与旧浏览器的向后兼容性,因此您可以使用 HTML5 来实现您在通用模板中所需的其他功能。

您可以在此链接HTML5 Attributes查看可用的 HTML 5 属性

支持的浏览器列表以及版本和示例可在此处获得:Example and supported browsers.

我建议您添加一个过滤器/拦截器,它将从请求中获取所有参数并放入一些数据结构或通用函数,帮助他们从请求中提取值,这将帮助后端开发人员从请求。

<form>
     <input type=submit value=Submit formenctype="application/x-www-form-urlencoded">
 </form>

您还可以编写一个 javascript 函数,该函数将在每次提交表单时调用,并将请求提交到基于服务器或属性或某些指定格式的服务器,即使客户端浏览器较旧。

希望对你有帮助。

【讨论】:

  • 您说“我建议您添加一个过滤器/拦截器,它将从请求中获取所有参数并放入一些数据结构或通用函数来帮助他们从请求中提取值...... " 我使用网络框架 django。我看不出有什么区别(有或没有 enctyp),除了我看看电线。该框架处理这两种数据交换方式。
  • @guettli 你是对的,但无论技术/框架如何,我都会写下来。在少数语言中,您需要明确处理相同的内容,而在其他语言中/或在框架的情况下,它由框架本身巧妙地处理。但在这种情况下,框架再次执行我要求您明确执行的相同操作。跨度>
【解决方案2】:

在您的表单中上传文件时,您应该specify the encoding as "multipart/form-data"

如果您想保持表单通用,请在表单中省略此属性,并使用输入或按钮元素的formenctype attribute 直接覆盖它(仅适用于支持 HTML5 的浏览器)。 在你的情况下,改变:

<form action="upload.php" method="post" enctype="multipart/form-data">
  Select image to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload Image" name="submit">
</form>

到:

<form action="upload.php" method="post">
  Select image to upload:
  <input type="file" name="fileToUpload" id="fileToUpload" formenctype="multipart/form-data">
  <input type="submit" value="Upload Image" name="submit">
</form>

此外,您可以使用enctype="multipart/form-data" 来检查this question 建议避免总是

【讨论】:

  • 这是一种从不在表单中使用enctype="multipart/form-data"的方法,它回答了他的问题。
  • @Mr.Alien 你以为我已经知道了吗?我知道一点,但不多。您可以为每个输入元素设置表单类型,这对我来说是新的。
  • 好吧@guettli 它是 HTML5 标准
【解决方案3】:

你可以用javascript来做

var file = document.getElementById('file').files[0]; 
var reader = new FileReader();
reader.readAsText(file, 'UTF-8');
reader.onload = sendData;


function sendData(event) {
    var result = event.target.result;
    var fileName = document.getElementById('file').files[0].name; 
    $.post('/api/sendData', { data: result, name: fileName }, continueSubmission);
}

【讨论】:

  • 感谢您的回答。我的高层次目标是少做,而不是多做。但你是对的,执行这个 javascript sn-p 可以解决不确定性(如果有人仍然不确定)
【解决方案4】:

上传文件时,您始终需要在表单标签中使用enctype=" multipart/form-data"。但是,当您不上传任何文件时,则没有必要。
谢谢:)
快乐编码!

【讨论】:

    【解决方案5】:

    我不能直接评论,所以我必须把它写成答案。

    我知道的唯一区别是后端是否使用 PHP(不知道这是否会影响 Java/Python 或除 PHP 之外的后端使用的任何其他语言)。

    如果 PHP 从 $_POST$_FILES 获取数据superglobals 那么应该没有问题,你可以一直使用它,但如果你使用它可能会遇到麻烦:

    $post_content = file_get_contents('php://input').

    据我所知,$post_content 中的内容变为空白或类似的内容(它可能适用于单个文件但不适用于多个文件,记不清了......)。

    【讨论】:

    • AFIK 这个问题与语言无关。它是关于现代 html 的。
    猜你喜欢
    • 2018-04-07
    • 2010-11-05
    • 2022-06-25
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2019-05-15
    相关资源
    最近更新 更多