2016-09-20 49 views
0

重複せずに.xlsxファイルをアップロードするアプリケーションを設計したいと思います。重複の条件は次のとおりです。 ユーザーがサーバー上で以前と同じデータと同じ名前のファイルをアップロードしようとすると、ファイルをアップロードしないでください。 しかし、以前にサーバーで利用可能だったものとは異なるデータと同じ名前のファイルをアップロードする場合、ファイルはサーバーにアップロードする必要があります。重複ファイルのアップロードを避ける

次のように私が書いたJSPは次のとおりです。次のように

<%@ 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

最終更新日はアプローチの1つになる可能性があります。他の方法はありますか? –

答えて

0

まあ、チェックサム(MD5、SHA1のリストを維持するだろう最も簡単な方法、...)を選択し、現在アップロードされているファイルのチェックサムがリストにあるかどうかをチェックします。

はあなたにも、(チェックサムのリストを取得するにはAJAXを使用して) をチェック、ブラウザ側を実行することができますが、あなたが持っているため、常に可能性があるとして、また、サーバ側でそれを行うには、帯域幅を保存するにはユーザーはブラウザ側のチェックを避け、ファイルを直接アップロードする必要があります。そのような場合は、それを検出して拒否する必要があります。

+0

あなたはコードでur答えをサポートすることができます –

関連する問題