pgql / Hibernate文件上传/下载 - 下载文件大小两倍?

时间:2013-09-09 13:15:57

标签: hibernate postgresql servlets download

我无法使用Java HttpServlet,Hibernate(3.5)&amp ;;实现文件上传/下载。 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

任何人都可以帮我解决这个问题吗?

提前thnx

1 个答案:

答案 0 :(得分:0)

看起来你的库连接到PostgreSQL不知道如何解码bytea的十六进制格式。您可以尝试将bytea_output的PostgreSQL设置更改为“escape”。 (如果有效,则表明您的图书馆已经过时了。)

我遇到了与Perl的DBD :: Pg相同的问题,却发现我使用的版本比我想象的要旧得多,并且在更新之后它会自动执行正确的操作而不管bytea_output设置。

相关问题