1

PostgreSQL、JSP、STRUTS フレームワークを使用するアプリケーションがあります

OID 型を使用して PostgreSQL のテーブルにファイルを挿入したいので、データベースに大きなオブジェクトとして保存されます。

私のテーブル定義はこれです:

CREATE TABLE mensaje
(
  id serial NOT NULL,
  file oid,
  CONSTRAINT pk_mensaje PRIMARY KEY (id)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE mensaje
 OWNER TO postgres;

Action、 、がどうActionFormあるべきかの例を知っている人.jspはいますか?

そうでない場合、OID タイプを使用せずにそれを行う方法を説明する他の例はありますか?

4

1 に答える 1

2

これは、問題を解決するための 2 段階のプロセスです。

  1. Struts 2 を使用したファイルのアップロード
  2. PostgreSQL Java チュートリアル、イメージの書き込みセクションを確認してください。

追記: ファイルがアクションで受信されたら、バイト配列データを使用してOIDフィールドに保存する必要があります。


あなたのコメントから、これはStruts 1.xの方法であるはずです

JSP で

<html:form action="fileUploadAction" method="post" enctype="multipart/form-data">
    File : <html:file property="upload" /> 
    <br />
    <html:submit />
</html:form>

あなたのアクションクラスで

YourForm uploadForm = (YourForm) form;
FormFile file = null;
try {
    file = uploadForm.getFile();
    //FormFile#getFileData() returns the byte array containing the file data
    //You can use it to save the file in your database and other things you want/need
    int id = 9001; //assuming this is a valid id in the mensaje table
    MensajeService mensajeService = new MensajeService();
    mensajeService.saveFile(id, file.getFileData());
} catch (Exception e) {
    //log the errors for maintenance purposes (bugs, fixes, etc) 
}

クラスはMensajeServicePostgre データベースに接続し、ファイルを保存します。

public class MensajeService {

    public MensajeService() {
    }

    public void saveFile(int id, byte[] fileData) throws SQLException {
        //this is a very simple skeleton, you have to adapt this to 
        //your needs, the way you're connecting to dabatase, etc...
        Connection con = null;
        PreparedStatement pstmt = null;
        try {
            con = ... //get the connection to your postgre db

            //Initialize a new transaction
            con.setAutoCommit(false);
            // Get the Large Object Manager to perform operations with
            LargeObjectManager lobj = ((org.postgresql.PGConnection)conn)
                .getLargeObjectAPI();
            // Create a new large object
            int oid = lobj.create(LargeObjectManager.READ | LargeObjectManager.WRITE);
            // Open the large object for writing
            LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);
            //in the provided example, the code shows a way to get the byte array data
            //from the file (using the File and FileInputStream classes)
            //you don't need all that because you already have the byte array (good!)
            //so you only write the binary data in your LargeObject (OID) object
            obj.write(fileData);

            //creating the SQL statement to insert the OID
            String sql = "INSERT INTO mensaje VALUES (?, ?)";
            pstmt = con.prepareStatement(sql);
            pstmt.setInt(1, id);
            ps.setInt(2, oid);
            //
            pstmt.setBinaryStream(2, fin, (int) img.length());
            //saving the file
            pstmt.executeUpdate();
            //closing the transaction successfully
            con.commit();
        } catch (SQLException e) {
            //error in the transaction, start a rollback
            if (con != null) {
                con.rollback();
            }
            throw e;
        } finally {
            //don't forget to free the resources after using them
            pstmt.close();
            con.close();
        }
    }
}

Struts 1 のコードは、 struts1 にファイルをアップロードすることから変更されました。

hereから適応された PostreSQL コード。

于 2012-11-03T23:16:52.233 に答える