web-dev-qa-db-ja.com

<input type = ‘file’> for IEフルパスを提供します。ファイル名のみが必要です

IEブラウザからアップロードを実行すると、そのバックエンド(org.Apache.commons.fileupload)は完全なファイルパスを取得します。

他のIE以外のブラウザでは、ファイル名が取得され、セキュリティ上の理由から問題ありません。

IEの入力からのみfilenameを取得する方法?

Apache libを編集することはあまり優雅ではないので、UIで行うことは可能ですか?.

たぶん、入力フィールドにいくつかのパラメータが存在しますか?

私はサーバーでそれを行うことができますが、UIアプローチに興味があります。

35
sergionni

ファイル入力のポイントは、fileを提供することです。付属の名前は「ブラウザベンダーが使用したいと思うものは何でも」であり、ファイルシステム上のファイル名とは何の関係も保証されていません。

ブラウザが送信するものを変更することはできません。

ブラウザから送信された名前を使用する場合は、needを使用して、それを使用するすべてのことに対して有効であることを確認します(たとえば、ファイルシステムのファイル名で許可されています)。これにより、サーバーで処理する必要があるものになります(他のクライアント提供データと同様に)。

23
Quentin

IEオプションも以下にあります:

  • インターネット設定
  • セキュリティタブ
  • 「インターネット」または「イントラネット」で、「カスタムレベル」をクリックします。
  • [セキュリティ設定]で、[ファイルをサーバーにアップロードするときにローカルディレクトリパスを含める]が表示されるまで下にスクロールして、無効にします。
  • [インターネットオプション]ウィンドウで[OK]をクリックして更新します。

アレックス

50
Alex

サーバー側でこれを試してください:

Path.GetFileName(file.FileName)
36
Barry

Xhrを介してFormDataでアップロードする場合、実際にはかなり簡単な回避策があります。 FormData.append api を使用すると、3番目の引数としてファイル名を渡すことができます。

const formData = new FormData();
//explicitly setting the file name works in IE 11
formData.append('file', file, file.name);
21
pllee

あなたはUIアプローチに興味があります。
javascriptで入力されたファイル名のみを含む非表示の入力フィールド(またはJSONエントリ)を追加できます。

次のクロスブラウザを使用する(IEを含む)/プラットフォームのJavaScript関数(完全な説明と参照付きの ここで私の答え から取得)、ファイル名のみを取得します。

_function extractFilename(s){ 
  // returns string containing everything from the end of the string 
  //   that is not a back/forward slash or an empty string on error
  //   so one can check if return_value===''
  return (typeof s==='string' && (s=s.match(/[^\\\/]+$/)) && s[0]) || '';
} _
<input type="file" onchange="alert(extractFilename(this.value));">
3
GitaarLAB

これはサーバー側から簡単に処理できるようですが、要件に基づいています。

私は本番環境でこれをテストし、うまく動作します。

String fileName = file.getName();
if (fileName != null) {
    fileName = FilenameUtils.getName(fileName);
}

IEはデフォルトでファイル名とともにフルパスを提供し、共有ディレクトリからファイルをアップロードするときに問題を引き起こします。上記のスニペットを追加すると、問題が解決し、すべての場合にうまく機能します。

1

xhrで投稿する場合は、ファイル名を指定するだけです

post look like this

0
Rana