2015-09-21 5 views
1

Веб-приложение, клиентская сторона - 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-помощи для реализации этого? Если так, то кто-нибудь может мне помочь? Или как решить проблему с подсчетом загрузки

+0

Cookies никогда не являются хорошей идеей для чего-либо, что касается предотвращения; они смехотворно легко обойти. Похоже, вы уже отслеживаете, когда пользователь загружает что-то через таблицу 'download'; введите код, который обрабатывает вашу загрузку, чтобы проверить, отслеживается ли предыдущее событие загрузки, и если да, перенаправляйте страницу ошибки. –

+0

Когда вы говорите, что «пользователям разрешено загружать каждый файл в БД только ONCE», как вы определяете пользователя? Пользователи идентифицируются с логином/паролем или вам нужно делать допущения на основе IP или что-то в этом роде? – StephaneM

+0

И как вы определяете загрузку? Что произойдет, если браузер будет отключен после загрузки половины файла? Что произойдет, если пользователь начнет две загрузки параллельно? – RealSkeptic

ответ

1

Если у вас есть контроль над базой данных, возможно, у вас есть другая таблица с столбцом user_id, file_id, download_status. Таким образом, вы всегда можете иметь записи, которые загружали файл.

+0

Спасибо за предложение, но у меня уже есть таблица в БД, которая показывает, какие файлы пользователи скачал :) – WT86

Смежные вопросы