一个Web应用程序,客户端是jsp,后端是JAVA,DB是简单的sqlite。 在DB中有一个表包含"文件"名为Reports,用户只能在数据库中下载每个文件一次"由于安全要求",我一直试图找到一种方法。 无论如何我可以写一个jsp代码,允许用户从DB下载一次所需的文件吗?
我不知道它是否有用,但这是用于从数据库下载的JAVA代码。
String sql = "SELECT file, filename FROM reports INNER JOIN download USING(tipid) WHERE reports.tipid = ?"+
"AND download.ts_" + ae_num+ " = 0;";
PreparedStatement stmt = c.prepareStatement(sql);
String tipNum = request.getParameter("tipid");
if (tipNum != null) {
stmt.setString(1, tipNum);
//stmt.setString(2, tipNum);
ResultSet res = stmt.executeQuery();
BufferedInputStream fileBlob = null;
String filename = "";
while (res.next()) {
fileBlob = new BufferedInputStream(res.getBinaryStream("file"), DEFAULT_BUFFER_SIZE);
filename = res.getString("filename");
}
if (fileBlob != null) {
System.out.println(filename);
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream(),
DEFAULT_BUFFER_SIZE);
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = fileBlob.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.close();
fileBlob.close();
Date now = new Date();
sql = "UPDATE download SET ts_" + ae_num + " = " + now.getTime() + " WHERE tipid = ?;";
System.out.println(sql);
stmt = c.prepareStatement(sql);
stmt.setString(1, tipNum);
stmt.executeUpdate();
stmt.close();
c.commit();
c.close();
我当前遇到的问题是,每当用户尝试下载所请求的文件以及用户是否选择打开/保存或取消时,即使取消,也会将其计为下载文件。
有什么想法吗?在JSP中使用cookie有助于实现吗?如果有,有人可以指导我吗?或者如何解决下载计数问题
答案 0 :(得分:1)
如果您可以控制数据库,则可能有另一个包含user_id,file_id,download_status列的表。这样你就可以随时拥有下载文件的记录。