8

最初に例を挙げて問題を説明すると思いますが、

jsfiddle: http://jsfiddle.net/e2UfM/15/ (FF 12 および Chrome 18.0.1025.168 でテスト済み)

使用法:

  • ローカル マシンからテキスト ファイルを読み込みます。
  • 「ファイルの読み込み」を押します。
  • 「ファイルサイズを表示」を押します-サイズに注意してください。
  • テキスト ファイルを変更して、ローカル マシンに保存します。
  • 「ファイルサイズを表示」をもう一度押します。Webkit ブラウザー (Chrome) ではファイル サイズがどのように変化するかに注意してください。ただし、Firefox ではファイル サイズが更新されませんでした。

Webkit 以外のブラウザーは、ユーザーが選択したローカル ファイルに変更を加えたときにサイズ属性を更新しませんが、たとえば Chrome は更新します。どちらのブラウザもファイルの内容を更新します。

この状況でChromeが行うのと同様に、Firefoxにファイルサイズを更新させる方法はありますか?


簡単な現実世界の例:

ユーザーがフォームには大きすぎるファイルを選択し、送信ボタンを押すと、ファイルが大きすぎるという通知を受け取ります (アラート、「サイズ」バー (以下を参照) などを介して)

彼らはファイルをローカルで変更し、もう一度送信を押します。

Chrome では、ファイル サイズが更新されます。ユーザーが送信ボタンをもう一度押すと、更新されたサイズがもう一度検証され、アップロードが許可されます。Firefox では、ファイル サイズが変更される前に、ユーザーはフォーム上でファイルを再選択する必要があります。

Firefox の部分的な回避策 - @ZER0 の回答


実際の例 (詳細):

ファイル API の目的の 1 つは、サーバーにアップロードする前にクライアント側でファイル サイズを確認することです。

フォームに 2MB のアップロード制限があり、ユーザーが 1MB のファイルを選択するシナリオを考えてみましょう。Firefox と Chrome の両方で、ファイル サイズが 2MB 未満であることを確認し、フォームに追加します。また、選択したファイルのサイズと、ファイル サイズの制限を満たしているかどうかを示すきちんとしたバーがあるとします。

ユーザーが選択した 1MB のファイルです。

しかし、ユーザーは、フォームを送信する前にそのファイルの内容をローカルで少し変更し、サイズを 2MB を超えることにしました。

Google Chrome では、クライアント側でこれを適切に処理できます。ユーザーがフォームを送信したときにファイル サイズを再度確認し、サーバーに送信する前に実際に 1 MB 未満であることを確認できます。しかし、Chrome では、ユーザーがフォームを送信する前であっても、小さなバーの画像を動的に更新して、ローカルで変更を加えることができます。

現在、ファイルは 2MB を超えています。

この「バー」(またはアラートなどの即時通知のその他のフォーム) は、ユーザーが大きなフォームに入力する場合に役立ちます。フォームを送信するときだけでなく、ファイルが大きすぎるときにすぐにユーザーに知らせて、そのときに修正できるようにしたいと思います。

Firefox ではファイルサイズが更新されないため、2MB のファイルを 1MB のままだと思って喜んでアップロードします。サーバー側のロジックを使用してファイル サイズを再確認しますが、サーバーへのトリップを節約したいと考えています。


バグに遭遇した方法:

上記の例は、ファイル API でスライス機能を使用するのではなく、おそらくフォームでファイルをアップロードする方が多いため、より多くの人に関連するように配置されています。これは、私が問題に直面している具体的な方法です。

私のフォームでは、ユーザーがファイルを選択し、送信を押すと、最後の 10,000 バイトのみが画面に表示され、textareaそれが本当に必要なファイルであることを確認します。

50,000サイズがバイトのファイルを考えてみましょう。ユーザーがフォームでそれを選択すると、Chrome と Firefox の両方でバイトが に表示40,000 - 50,000されますtextarea

ここで、ユーザーはファイルにいくつかのコンテンツを追加し、同じファイルを70,000バイトにバンプします!

Google Chrome はtextarea、 bytes を含むように を適切に更新します60,000-70,000。Firefox では、サイズが一定のままであるため、範囲内のバイトのみが表示されます40,000-50,000


編集: jsfiddle を更新して、FF が更新されたファイルの内容を引き続き読み取ることができることを示しました。ファイルサイズがそれらの新しいコンテンツで変わらないというだけです。

編集: https://bugzilla.mozilla.org/show_bug.cgi?id=756503 (バグレポート)

編集: @Eduárd Moldován のコメントと @ZER0 の回答に応じて、例が追加および更新されました。ありがとう!

4

1 に答える 1

1

プロパティは直接取得しているようです。sizeこのフォーム要素の値は変更されていないため、Firefoxもsizeプロパティを更新しない可能性があります。

回避策として、length読んだコンテンツのを確認できます。だから、持っている代わりfile.sizeevt.target.result.length

しかし、それは間違いなく私にとってのバグなので、Bugzillaに追加するのはうまくいきました!

更新:文字列バージョンのsliceを引き続き使用できます。それ以外の場合は、必要に応じて(またはresult特定のタイプのデータである場合)、プロパティとメソッドの両方を使用できるevt.target.result新しいBlobオブジェクト(ファイルオブジェクトはこのインターフェイスを使用)から作成できます。sizeslice

于 2012-06-05T21:37:56.140 に答える