0

一般に、Java HttpServlet、Hibernate(3.5)、および Postgresql Server(9.1.9) でファイルのアップ/ダウンロードを実現するのに問題があります。問題は、次の方法でファイルをアップロードするときです。

FileItemFactory factory = new DiskFileItemFactory();

    ServletContext servletContext = this.getServletConfig().getServletContext();
    File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
    ((DiskFileItemFactory) factory).setRepository(repository);

    ServletFileUpload upload = new ServletFileUpload(factory);
    try {
        List<FileItem> items = upload.parseRequest(request);
            byte[] dataBytes = items.get(0).get();
        Session session = (Session) entityManager.getDelegate();
        SQLQuery query = session
                .createSQLQuery("SELECT nextval('test_vorgabe.seq_did')");
        Long key = ((BigInteger) query.uniqueResult()).longValue();
        session.flush();
        Datei datei = new Datei();
        datei.setDid(key);
        datei.setRevision(new Date(System.currentTimeMillis()));
        datei.setFilename(items.get(0).getName()
                );
        datei.setFile(dataBytes);
        session.save(datei);
        session.flush();

    } catch (FileUploadException e) {
        e.printStackTrace();
    }

これは正常に動作しているようです (ファイル サイズも私のコンピューターと同じです)。クライアントに送り返すときはもう。

        String dateiname = request.getReader().readLine();
    System.out.println("Dateiname: " + dateiname);
    dateiname = dateiname.replace("isc_TextItem_", "");
    dateiname = dateiname.substring(2);

    while (dateiname.startsWith("=")) {
        dateiname = dateiname.substring(1);
    }
    System.out.println(dateiname);
    Session session = (Session) entityManager.getDelegate();
    Criteria crit = session.createCriteria(Datei.class);

    crit.add(Restrictions.eq("filename", dateiname));
    Datei datei = (Datei) crit.list().get(0);
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-disposition", "attachment;filename=\""
            + datei.getFilename() + "\"");
    ServletOutputStream stream = response.getOutputStream();
    stream.write(datei.getFile());
    stream.flush();
    stream.close();

エンティティ Bean のソースも含めます。

@Entity
@Table(name = "datei", schema = "test_vorgabe")
public class Datei implements java.io.Serializable {

private long did;
private Vorgabe vorgabe;
private String filename;
private byte[] file;
private Date revision;

public Datei() {
}

public Datei(long did, String filename, byte[] file, Date revision) {
    this.did = did;
    this.filename = filename;
    this.file = file;
    this.revision = revision;
}

public Datei(long did, Vorgabe vorgabe, String filename, byte[] file,
        Date revision) {
    this.did = did;
    this.vorgabe = vorgabe;
    this.filename = filename;
    this.file = file;
    this.revision = revision;
}

@Id
@Column(name = "did", unique = true, nullable = false)
public long getDid() {
    return this.did;
}

public void setDid(long did) {
    this.did = did;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "vid")
public Vorgabe getVorgabe() {
    return this.vorgabe;
}

public void setVorgabe(Vorgabe vorgabe) {
    this.vorgabe = vorgabe;
}

@Column(name = "filename", nullable = false)
public String getFilename() {
    return this.filename;
}

public void setFilename(String filename) {
    this.filename = filename;
}

@Column(name = "file", nullable = false)
public byte[] getFile() {
    return this.file;
}

public void setFile(byte[] file) {
    this.file = file;
}

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "revision", nullable = false, length = 29)
public Date getRevision() {
    return this.revision;
}

public void setRevision(Date revision) {
    this.revision = revision;
}

}

postgresqlにbyteaとして保存されます

誰でもこの問題を解決するのを手伝ってもらえますか?

事前にt​​hnx

4

1 に答える 1

0

PostgreSQL に接続するためのライブラリが、bytea の 16 進形式をデコードする方法を認識していないようです。bytea_output の PostgreSQL 設定を「エスケープ」に変更してみてください。(それが機能する場合は、ライブラリがかなり古くなっていることを示唆しています。)

私は Perl の DBD::Pg でも同じ問題を抱えていましたが、自分が思っていたよりもずっと古いバージョンを使用していたことに気付きました。それを更新すると、bytea_output の設定に関係なく、自動的に正しいことが行われました。

于 2013-09-09T23:29:17.527 に答える