使用`enctype =" multipart / form-data"`永远或永远不会?

时间:2017-07-12 14:39:11

标签: html forms file-upload browser

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

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

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

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

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

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

它的工作

我们在所有表单中使用enctype="multipart/form-data"几个月(即使没有要上传的文件)。

有效。这使我们的模板更简单。对我而言,这是实现大目标的一个简单步骤&#34;无条件代码&#34;。

5 个答案:

答案 0 :(得分:12)

在表单中上传文件时,您应该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>

此外,您可以检查this question建议使用enctype="multipart/form-data" 始终的地方。

答案 1 :(得分:2)

I cannot comment directly so I have to write it as an answer.

The only difference I am aware of is in the backend if the backend is using PHP (have no clue if this affects Java/Python or any other language used in the backend apart from PHP).

If PHP is fetching the data from the $_POST and $_FILES superglobals then there should be no problem, you can always use it, but you might have troubles if you are using :

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

As far as I can remember the content inside $post_content becomes blank, or something similar (it might work with a single file but not multiple files, can't remember correctly...).

答案 2 :(得分:1)

你可以用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);
}

答案 3 :(得分: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函数,该函数将在每个表单提交时调用,并将请求提交给服务器或属性或某些指定格式,即使客户端浏览器较旧也可以使用。

我希望它有所帮助。

答案 4 :(得分:-1)

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