8

HTML5の複数アップロード機能を使用しています。

<input name='upload[]' type=file multiple="multiple" id="profileImages" />

その完璧な動作。今私は1つのクエリがあります

画像のアップロード中、複数のアップロードは任意の順序に従いますか?

私が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))に1つの画像を選択する方が簡単になるため、作業が簡単になりますprofile_id

4

4 に答える 4

4

HTML5は、サーバーが関係するファイルのアップロードとは何の関係もありません。限目。信頼できる「注文」はありません。コメントが指摘しているように、新しいHTML5フィールドから生じる実際の順序multipleは、ブラウザーごとに異なる可能性があります。その理由を理解するには、ユーザーエージェント(ブラウザー)が複数のファイルフィールドを持つフォームを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'];

おそらく、あなたの場合のより良い解決策は、直接名前が付けられた1つのファイルフィールドを用意し(したがって、それがプライマリフィールドであることが常にわかっている)、ユーザーがさらにファイルを追加できるように複数選択フィールドを追加することです。

于 2012-08-25T05:09:33.010 に答える
2

簡単に言えば、いいえ、それはブラウザとサーバー、そして彼らがそれをしたい順序に依存します。

ファイルをWebページからPHPに取得するには、3つのステップが必要です。

  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

Google Chromeでは、アップロードするすべてのファイルがファイル名に従って配置されます。私はそれをテストしました。

于 2021-07-30T07:07:52.977 に答える