5

アプリケーション用の API を作成しています。GUI ブラウザー ベースのアプリケーションでは、ファイルはフォーム送信によってアップロードされます。だから私は単純にそうしますCommonsMultipartFile file = request.getFile(myfile)。ただし、API は、ファイルをアップロードするのではなく、ファイルへの絶対パスを文字列として提供します。私のアプリケーションは、この絶対パスにアクセスできます。

アプリケーションの基礎となるメソッド (共通インターフェースを受け入れる) を変更する必要がないように、MultiPartFileAPI の目的で、この絶対パスからファイルを読み取り、CommonsMultipartFileメソッドに渡すことができるオブジェクトを作成したいと考えています。既に GUI ブラウザー ベースのアプリケーションに使用しています。

これどうやってするの?CommonsMultipartFileを受け入れるコンストラクターFileItem

4

2 に答える 2

2

これは API 固有のコードです。つまり、通常のファイル アップロード コードではありません。

通常の手順は次のとおりです。

  1. FileItemFactory を構築する
  2. ServletFileUpload を構築し、それをファクトリに渡します
  3. ServletFileUpload.parseRequest(リクエスト) を呼び出す

この回答は、2と3をサーブレットに依存しないロジックに置き換えます-ServletFileUpload(サーブレット固有)とその祖先FileUpload(絶対パス名でファイルの場所を制御するため)の使用を回避します。注: (3) 通常、HTTP 要求パラメーターを調べて、FileItemFactory.createItem に渡される下位レベルのパラメーターを決定します。これらのパラメーターは代わりに手動で提供され、情報メタデータとしてのみ使用されます。2 & 3 の交換:

  • FileItem を構築します (FileItemFactory.createItem を介して - 通常は ServletFileUpload.upload() を介して決定される下位レベルのパラメーターを手動で提供する必要があります)
  • 絶対パスで特定のファイルに書き込む
  • MultipartFile 経由でファイルをアップロードする

以下に提供される要求されたコード。最後に、サーブレットのアップロードと共有される共通コードを呼び出します。

// Initialise Apache Commons FileItemFactory for API use only
FileItemFactory fif = new DiskFileItemFactory(sizeThreshold, repositoryBaseDirFile);

// Create Apache Commons FileItem & write file at fullFilePathString into it
FileItem fi = fif.createItem(fieldName, contentType, isFormField, fileName);
fi.write(new java.io.File(new java.net.URI(fullFilePathString));

// Convert FileItem to Spring wrapper: CommonsMultipartFile
org.springframework.web.multipart.MultipartFile mf = new CommonsMultipartFile(fi);

// From here, reuse the same code as the servlet upload.  Operate only upon  
// Spring MultipartFile, but not ServletFileUpload, FileItemFactory etc...

パラメーター:

  • fullFilePathString : ファイルがアップロードされる絶対パス (文字列として)
  • fieldName : フォーム上のフィールドの名前

(ServletFileUpload と FileUpload は回避されるため、以下はメタデータ フィールドのみになり、処理の制御には使用されません)

  • sizeThreshhold : メモリ サイズのしきい値 (バイト単位) (通常、小さいファイルはメモリのみを使用してアップロードされ、大きいファイルはディスク経由でアップロードされますが、このロジックではファイルは常にディスク経由でアップロードされます)。デフォルト = DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD。
  • repositoryBaseDireFile :通常、ファイル アップロードの 'temp' ディレクトリ (ファイル タイプとして) ですが、このロジックでは絶対パスを使用してファイルをアップロードします
  • contentType : フォームのフィールドのコンテンツ タイプ (MIME タイプ) (マルチパート フォーム フィールドでない場合は null)
  • isFormField : プレーン フォーム フィールドの場合は「true」、それ以外の場合はマルチパート フィールドの場合は false。
  • fileName : ファイルの名前 - 通常はフォーム / クライアント経由で指定されます。
于 2013-05-22T03:25:09.820 に答える