8

我正在使用 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

上述问题的答案将使我的工作变得容易,因为如果按我们选择的顺序上传多张图片,那么为给定的主要个人资料图片(使用MIN(id)MAX(id))选择一张图片会更容易profile_id

4

4 回答 4

4

HTML5与服务器相关的文件上传无关。时期。没有可靠的“秩序”。正如评论所指出的,新 HTML5multiple字段产生的实际顺序可能因浏览器而异。要了解原因,我们需要看看当用户代理(浏览器)向 PHP 服务器提交具有多个文件字段的表单时会发生什么。

当您从 HTML 表单上传多个文件时,您的浏览器会自动为您做几件事:

  1. 发送一个Content-Type: multipart/form-data标头来通知远程 HTTP 服务器它正在这个单个请求的上下文中发送几个离散的信息“块”。
  2. 构建符合 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'];

在您的情况下,也许更好的解决方案是简单地拥有一个直接命名的文件字段(因此您始终知道它是主要字段),然后添加多选字段供用户添加更多文件。

于 2012-08-25T05:09:33.010 回答
2

简单地说,不,这取决于浏览器和服务器以及他们希望执行的顺序。

对于从网页到 PHP 的文件,需要三个步骤。

  1. 浏览器获取文件并将它们很好地放入 Apache(或其他)的帖子中,然后传输所有内容。

  2. 浏览器将看到传入的数据,将保留标头,其中一些将传递给 PHP,但不是全部,对于文件,它会将它们写入 /tmp,然后将它们所在位置的信息发送给 PHP。

在购买上述情况下,订单可以更改。从技术上讲,它们应该按相同的顺序排列,但不是必须的。在通过 Flash 或任何其他多选选项批量上传的情况下,它们将反向进行,但取决于 wo 知道哪些文件可能会从它们的顺序中取出并放在第一位或最后一位。

确保它们按相同顺序排列的最佳方法是为所有文件字段使用不同的名称,而不是使用数组。

于 2012-09-01T22:55:51.340 回答
0

我在使用 Laravel 媒体库包时遇到了这样的问题。

当我想上传多个文件时,这是一个问题,因为与我在数据库中保存时选择的顺序相比,使用了不同的顺序。

反正,

事实上,我们有时会因为思维复杂而犯错。作为解决方案,我做了输入中继器。

像一个

<input name='upload[]' type='file'/>
<input name='upload[]' type='file'/>
<input name='upload[]' type='file'/>

这样,我们就可以按顺序发布每个上传的文件。是的,我们不能选择多个,但我找不到任何其他解决方案。

我觉得还不错。

于 2021-04-25T11:58:38.563 回答
-1

在谷歌浏览器中,您上传的所有文件都会根据文件名进行排列。我已经测试过了。

于 2021-07-30T07:07:52.977 回答