我正在使用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'
还是取决于 filesize 或浏览器或任何其他因素/属性?
此外,我将这些图像分别存储在 profile_image_table
中id(pk ) | profile_id | image_name
上述问题的答案将使我的工作变得简单,因为如果按照我们选择的顺序上传多个图片,那么为主要配置文件图像(使用MIN(id)
或MAX(id)
)选择一个图像会更容易给定profile_id
。
答案 0 :(得分:4)
HTML5与无与服务器所关注的文件上传有关。期。没有可靠的“订单”。正如评论所指出的那样,新HTML5 multiple
字段产生的实际订单因浏览器而异。为了理解原因,我们需要看看当用户代理(浏览器)将具有多个文件字段的表单提交给PHP服务器时会发生什么。
当您从HTML表单上传多个文件时,浏览器会自动为您执行以下操作:
Content-Type: multipart/form-data
标头以通知远程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'];
在您的情况下,或许更好的解决方案是只需要一个直接命名的文件字段(因此您始终知道它是主要字段),然后为用户添加多选字段以添加更多文件。
答案 1 :(得分:2)
简单地说,不,这取决于浏览器和服务器以及他们希望执行的顺序。
对于从网页到PHP的文件,需要三个步骤。
浏览器获取文件并将它们很好地放入Apache(或其他)的帖子中,然后传输所有内容。
浏览器将看到传入的数据,将保留标题,其中一些将传递给PHP但不是全部,并且文件将它们写入/ tmp然后发送它们的位置信息位于PHP。
在购买上述情况下,订单可以更改。 从技术上讲,他们应该按照相同的顺序,但不是必须的。 如果通过Flash或任何其他多选项进行批量上传,它们将反过来,但在wo上的延迟会知道哪些文件可能从他们的订单中取出并放在第一位或最后一位。
确保它们按相同顺序排列的最佳方法是为所有文件字段使用不同的名称,而不是使用数组。
答案 2 :(得分:0)
我在使用 Laravel media-library 包时遇到了这样的问题。
当我想上传多个文件时,这是一个问题,因为与我在数据库中保存时选择的顺序相比,使用了不同的顺序。
无论如何,
事实上,我们有时会因为思维复杂而犯错误。作为解决方案,我确实输入了中继器。
喜欢
<input name='upload[]' type='file'/>
<input name='upload[]' type='file'/>
<input name='upload[]' type='file'/>
这样,我们就可以按顺序发布每个上传的文件。是的,我们无法选择多个,但我找不到任何其他解决方案。
我觉得还不错。
答案 3 :(得分:-1)
在谷歌浏览器中,您上传的所有文件都会根据文件名进行排列。我已经测试过了。