Веб-приложение, клиентская сторона - jsp, а бэкэнд - JAVA, DB - простой sqlite. В БД есть таблица, содержащая «файлы», называемые «Отчеты», и пользователям разрешено загружать каждый файл в БД только ОДИН РАЗ «Из-за требований безопасности», и я пытался найти способ сделать это. Есть ли в любом случае я могу написать код jsp, который позволяет пользователям загружать запрошенный файл один раз из БД?Разрешить пользователям скачивать только один раз
Я не знаю, полезно ли это, но это кусок кода 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();
Текущая проблема у меня в том, что всякий раз, когда пользователь пытается скачать требуемый файл и выбрал ли пользователь, чтобы открыть/сохранить или отменить, это будет считаться загруженным файлом, даже с Отмена.
Любые идеи? Будет ли использование cookie в JSP-помощи для реализации этого? Если так, то кто-нибудь может мне помочь? Или как решить проблему с подсчетом загрузки
Cookies никогда не являются хорошей идеей для чего-либо, что касается предотвращения; они смехотворно легко обойти. Похоже, вы уже отслеживаете, когда пользователь загружает что-то через таблицу 'download'; введите код, который обрабатывает вашу загрузку, чтобы проверить, отслеживается ли предыдущее событие загрузки, и если да, перенаправляйте страницу ошибки. –
Когда вы говорите, что «пользователям разрешено загружать каждый файл в БД только ONCE», как вы определяете пользователя? Пользователи идентифицируются с логином/паролем или вам нужно делать допущения на основе IP или что-то в этом роде? – StephaneM
И как вы определяете загрузку? Что произойдет, если браузер будет отключен после загрузки половины файла? Что произойдет, если пользователь начнет две загрузки параллельно? – RealSkeptic