2016-09-20 2 views
0

Я хочу создать приложение, которое загружает файлы .xlsx без дублирования. Условие для дублирования выглядит следующим образом: Если пользователь пытается загрузить файл с теми же данными и тем же именем, что и ранее доступным на сервере, тогда файл не должен быть загружен. Но если он загружает файл с разными данными и тем же именем, которые ранее были доступны на сервере, тогда файл должен быть загружен на сервер.избежать дублирования загрузки файла

СПЯ я написал это следующим образом:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>File Upload</title> 
</head> 
<body> 
<script> 
var _validFileExtensions = [".xlsx"];  
function Validate(oForm) { 
    var arrInputs = oForm.getElementsByTagName("input"); 
    for (var i = 0; i < arrInputs.length; i++) { 
     var oInput = arrInputs[i]; 
     if (oInput.type == "file") { 
      var sFileName = oInput.value; 
      if (sFileName.length > 0) { 
       var blnValid = false; 
       for (var j = 0; j < _validFileExtensions.length; j++) { 
        var sCurExtension = _validFileExtensions[j]; 
        if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) { 
         blnValid = true; 
         break; 
        } 
       } 

       if (!blnValid) { 
        alert("Sorry, " + sFileName + " is invalid, allowed extensions are: " + _validFileExtensions.join(", ")); 
        return false; 
       } 
      } 
     } 
    } 

    return true; 
} 
</script> 
<center> 
<h3> File Upload</h3> 
<br> 
<form action="./UploadServlet" method="post" enctype="multipart/form-data" onsubmit="return Validate(this);"> 
Select .xlxs to upload <br> 
<input type="file" name="uploadFile" size="50"> 
<br><br> 
<input type="submit" value="Upload File"> 
</form> 
</center> 
</body> 
</html> 

Мой сервлет выглядит следующим образом:

package com.ideas.webapp; 

import java.io.File; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.util.Iterator; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.fileupload.FileItem; 
import org.apache.commons.fileupload.disk.DiskFileItemFactory; 
import org.apache.commons.fileupload.servlet.ServletFileUpload; 

@WebServlet(name = "servlet", urlPatterns = { "/UploadServlet" }) 

public class uploadServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    private static final String UPLOAD_DIRECTORY = "upload"; 



    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     // checks if the request actually contains upload file 
     if (!ServletFileUpload.isMultipartContent(req)) { 
      PrintWriter writer = resp.getWriter(); 
      writer.println("Request does not contain upload data"); 
      writer.flush(); 
      return; 
     } 

     // configures upload settings 
     DiskFileItemFactory factory = new DiskFileItemFactory(); 

     factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); 

     ServletFileUpload upload = new ServletFileUpload(factory); 


     // constructs the directory path to store upload file 
     String uploadPath = getServletContext().getRealPath("") 
      + File.separator + UPLOAD_DIRECTORY; 
     // creates the directory if it does not exist 
     File uploadDir = new File(uploadPath); 
     if (!uploadDir.exists()) { 
      uploadDir.mkdir(); 
     } 

     try { 
      // parses the request's content to extract file data 
      List formItems = upload.parseRequest(req); 
      Iterator iter = formItems.iterator(); 

      // iterates over form's fields 
      while (iter.hasNext()) { 
       FileItem item = (FileItem) iter.next(); 
       // processes only fields that are not form fields 
       if (!item.isFormField()) { 
        String fileName = new File(item.getName()).getName(); 
        String filePath = uploadPath + File.separator + fileName; 
        File storeFile = new File(filePath); 

        // saves the file on disk 
        item.write(storeFile); 
       } 
      } 
      System.out.println("Upload has been done successfully!"); 
     } catch (Exception ex) { 
      System.out.println("There was an error: " + ex.getMessage()); 
     } 
     getServletContext().getRequestDispatcher("/uploadFile.jsp").forward(req, resp); 
    }  
     } 
+0

Вы имеете в виду данные как в содержании файла, так и на дату его изменения? Это может быть свойство файла, который вы могли бы проверить? Если последняя измененная дата после сохранения, разрешить ее загрузить? – AsheraH

+0

Последнее изменение даты может быть одним из подходов .. Есть ли другой подход? –

ответ

0

Ну, самый простой способ будет держать список контрольных сумм (MD5, SHA1 , ... выберите один из ранее загруженных файлов и проверьте, находится ли контрольная сумма текущего загруженного файла в списке.

Чтобы сохранить пропускную способность, можно также выполнить проверку на стороне браузера (с использованием AJAX, чтобы получить список контрольных сумм), но вы должны сделать это также на стороне сервера, так как всегда есть возможность для чтобы избежать проверки на стороне браузера и загрузить файл напрямую. В таком случае вам необходимо обнаружить и отказаться от него.

+0

может поддерживать u ответ с кодом –

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