我努力让文件上传/下载在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)
关于可能出错的任何想法?
答案 0 :(得分:1)
不要将文件保存在DB中,文件系统要好得多!使用一些唯一的名称将上传的文件保存在磁盘上,然后在数据库中仅保留String
文件的路径!
处理下载更容易,例如在Play中,您需要提供的所有内容都是:
public static Result download() {
File file = new File("/full/path/to/your.pdf");
return ok(file);
}
它不仅会为PDF设置正确的标题,例如Content-Disposition
,Content-Length
和Content-Type