我使用HTML5多重上传功能。
<input name='upload[]' type=file multiple="multiple" id="profileImages" />
它的工作非常完美。现在我有一个查询
在上传图像时,多次上传是否遵循任何顺序
假设我有5张图像
a.png
b.png
c.png
d.png
e.png
现在上传图像时,如果我选择低于顺序的图像
a.png,
b.png,
e.png,
d.png,
c.png
这些图片会按照我选择的顺序上传吗
意味着$_FILES['upload']['name']
阵列将具有(使用PHP)
[0] =>'a.png',
[1] =>'b.png',
[2] =>'e.png',
[3] =>'d.png',
[4] = >'c.png'
或者它取决于文件大小、浏览器或任何其他因素/属性?
旁注
进一步,我将这些图像单独存储在profile_image_table中
id(pk ) | profile_id | image_name
上述问题的答案将使我的工作变得容易,因为如果按照我们选择的顺序上传多个图像,那么选择一个图像作为给定profile_id
的主配置文件图像(使用MIN(id)
或MAX(id)
)会更容易。
HTML5与服务器相关的文件上传无关。时期没有可靠的"顺序"。正如评论所指出的,新的HTML5 multiple
字段产生的实际顺序可能因浏览器而异。为了理解原因,我们需要看看当用户代理(浏览器)向PHP服务器提交带有多个文件字段的表单时会发生什么。
当你从HTML表单上传多个文件时,你的浏览器会自动为你做几件事:
- 发送一个
Content-Type: multipart/form-data
标头,通知远程HTTP服务器它正在该单个请求的上下文中发送几个离散的信息"块" - 构建符合HTTP规范的原始HTTP消息,以使用HTTP协议传输文件
原始HTTP消息看起来像这样:
POST /somePath HTTP/1.1
User-Agent: my-browser-v0.1
Host: www.example.com
Content-Length: 42
Content-Type: multipart/form-data; boundary=--------------------
------------------------------
Content-Disposition: form-data; name="file[]" filename="file1.txt"
Content-Type: text/plain
these were the contents of file1.txt
------------------------------
Content-Disposition: form-data; name="file[]"; filename="file2.txt"
Content-Type: text/plain
these were the contents of file2.txt
这完全取决于浏览器从表单中放置数据的顺序。用户代理嗅探并不是确定顺序的可行选项。相反,如果字段的顺序很重要(这是一个毫无意义的想法,但不管怎样),您应该使用一种形式,其中有有限数量的可能的文件字段,并分别命名它们。通过这种方式,您可以通过$_FILES
数组中的字段名来访问文件。毕竟,你不需要仅仅因为HTML5的存在就使用它:
<form action='' method='post' enctype='multipart/form-data'>
<input name='file1' type=file>
<input name='file2' type=file>
<input type='submit'>
</form>
在您的PHP文件中,直接通过字段的名称访问字段。您将知道哪个表单字段名称是第一个,因为您是以这种方式编码HTML的:
<?php
$_FILES['file1'];
$_FILES['file2'];
在您的情况下,一个更好的解决方案可能是简单地有一个直接命名的文件字段(这样您就知道它是主字段),然后添加多选字段供用户添加更多文件。
简单地说,不,这取决于浏览器和服务器以及他们希望执行的顺序
对于一个从网页到PHP的文件,需要三个步骤。
-
浏览器接收这些文件,并将它们很好地放在Apache(或其他)的帖子中,然后传输所有内容。
-
浏览器将看到传入的数据,保留标题,其中一些将传递给PHP,但不是全部,对于文件,它将把它们写入/tmp,然后将它们的位置信息发送给PHP。
在购买上述情况下,订单可能会发生变化。从技术上讲,它们应该按照相同的顺序进行,但不是必须的。在通过Flash或任何其他多选选项进行批量上传的情况下,它们将反向进行,但我知道哪些文件可能会从他们的订单中删除,并放在第一个或最后一个。
确保它们按相同顺序排列的最佳方法是对所有文件字段使用不同的名称,而不是使用数组
我在使用Laravel媒体库包时遇到了这样的问题。
当我想上传多个文件时,这是一个问题,因为与我在数据库中保存时选择的顺序相比,使用了不同的顺序。
不管怎样,
事实上,我们有时会因为思维复杂而犯错。作为一个解决方案,我做了输入中继器。
像
<input name='upload[]' type='file'/>
<input name='upload[]' type='file'/>
<input name='upload[]' type='file'/>
通过这种方式,我们可以按顺序发布每个上传的文件。是的,我们不能选择多个,但我找不到任何其他解决方案。
我觉得还不错。
在Google Chrome中,您上传的所有文件都会根据文件名进行排列。我已经测试过了。