文件下载在Play框架2.2.2中返回损坏的文件(我认为)

时间:2014-05-08 07:53:51

标签: java file-upload playframework download playframework-2.2

我努力让文件上传/下载在Play framework 2.2.2中正常运行。我有一个名为" cv"的学生班。它用@Lob注释,如下所示:

@Lob
public byte[] cv;

以下是上传和下载方法:

public static Result upload() {

    MultipartFormData body = request().body().asMultipartFormData();
    FilePart cv = body.getFile("cv");

    if (cv != null) {
        filenameCV = cv.getFilename();
        String contentType = cv.getContentType();
        File file = cv.getFile();
        Http.Session session = Http.Context.current().session();
        String studentNr = session.get("user");
        Student student = Student.find.where().eq("studentNumber", studentNr).findUnique();

        InputStream is;
        try {
            is = new FileInputStream(file);
            student.cv = IOUtils.toByteArray(is);
        } catch (IOException e) {
            Logger.debug("Error converting file");
        }

        student.save();
        flash("ok", "Vellykket! Filen " + filenameCV + " ble lastet opp til din profil");
        return redirect(routes.Profile.profile());
    } else {
        flash("error", "Mangler fil");
        return redirect(routes.Profile.profile());
    }
}

public static Result download() {
    Http.Session session = Http.Context.current().session();
    Student student = Student.find.where().eq("studentNumber", session.get("user")).findUnique();

    File f = new File("/tmp/" +filenameCV);

    FileOutputStream fos;

    try {
        fos = new FileOutputStream(f);
        fos.write(student.cv);
        fos.flush();
        fos.close();

    } catch(IOException e) {

    }

    return ok(f);
}

该文件似乎已正确保存到数据库中(cv字段填充了数据,但它显然对我来说很神秘,所以我不确定内容是什么&#39 ; s应该是)

当我访问我的网站并点击"下载简历"链接(运行下载操作),文件下载但无法打开 - 说PDF查看器无法识别文件等(上传的文件必须是PDF)

关于可能出错的任何想法?

1 个答案:

答案 0 :(得分:1)

不要将文件保存在DB中,文件系统要好得多!使用一些唯一的名称将上传的文件保存在磁盘上,然后在数据库中仅保留String文件的路径!

  • 长跑(as said many times
  • 会更便宜
  • 处理下载更容易,例如在Play中,您需要提供的所有内容都是:

    public static Result download() {
        File file = new File("/full/path/to/your.pdf");
        return ok(file);
    }
    

它不仅会为PDF设置正确的标题,例如Content-DispositionContent-LengthContent-Type