1

JPAを使用してアップロードされたファイルをデータベースに永続化しようとしています。(私にとって)最も「自然な」方法は、ドメインオブジェクトを次のように定義することです。

@Entity
class UploadFile {
  ...
  public CommonsMultipartFile getFileData()
  {
    return fileData;
  }
}

しかし、そのようなデータベースマッピングタイプがないため、これは機能しません。オンラインで検索すると、人々は次の2つの方法のいずれかを採用しているようです。

  • フィールドを次のように定義しますjava.sql.blob;
  • フィールドを次のように定義しますbyte[]

クラスでは、にアクセスしてストリームに戻すために@Controller、着信HttpServletRequestがキャストされます。MultipartHttpServletRequestMultipartFilebyte[]

ただし、このスキームでは、「ランダムな」結果が得られ、困惑します。時々、「beanプロパティが読み取れません」というエラーが発生し、byte[]フィールドのgetterメソッドの戻り型が一致しない可能性があります。Bean定義をダブルおよびトリプルチェックしましたが、何も問題は見つかりませんでした。

私の質問は2つあると思います。(1)このコンテキストでこのエラーが発生する理由はありますか?(2)さらに重要なことに、このようにアップロードされたファイルを処理する「推奨される」方法は何ですか?

ありがとう

オリバー

4

1 に答える 1

2

java.sql.blobアップロードされたファイルをデータベースに保存するには、aまたはaのいずれかbyte[]が最も適切な方法であるというのは正しいことです。

これらは一時的なオブジェクトであることが意図されているため、データベースにMultipartFileまたはを格納しないでください。javadocCommonsMultipartFileからこれに注意してください:MultipartFile

ファイルの内容は、メモリに保存されるか、一時的にディスクに保存されます。いずれの場合も、必要に応じて、ユーザーはファイルの内容をセッションレベルまたは永続ストアにコピーする必要があります。一時ストレージは、リクエスト処理の最後にクリアされます。

私はあなたHttpServletRequestがしていることを完全にはフォローしていませんが、アップロードを処理する最も簡単な方法のようには思えません。アップロードを処理する最も簡単な方法はMultipartFile、コントローラーメソッドでパラメーターを作成することです(Spring 3.0以降を使用している場合は、私は思います)。

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public void exampleFileUpload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        try {
            byte[] fileBytes = file.getBytes();

            // Persist those bytes using JPA here

        } catch (IOException e) {
            // Exception handling here
        }
    }
}

byte[]リクエストが完了する前に、つまりアップロードの処理に使用される一時ファイルが削除される前に、バイトを配列に抽出したため、これは確実に機能するはずです。

于 2011-03-08T06:31:58.217 に答える