2012-02-20 47 views
2

最近我已經實現在Java使用該Google Docs API v3.0的應用程序。創建這樣的新條目:谷歌文檔API「setMd5C​​hecksum」不工作

DocumentListEntry newEntry = new DocumentListEntry(); 
newEntry.setFile(file, Common.resolveMimeType(file)); //Common is a custom class 
newEntry.setFilename(entryTitle.getPlainText()); //entryTitle is a TextConstruct 
newEntry.setTitle(entryTitle); 
newEntry.setDraft(false); 
newEntry.setHidden(file.isHidden()); 
newEntry.setMd5Checksum(Common.getMD5HexDigest(file)); 

相信我,當我告訴你,Common.getMD5HexDigest(file)返回一個有效且唯一的MD5哈希值十六進制。

現在,在檢索文件並通過entry.getMd5Checksum()方法檢查MD5校驗和時,文件上傳得當,它始終返回null

我用盡了一切辦法,甚至成立了ETagResourceIDVersionID但是大家都能用默認值(null或服務器生成的字符串)覆蓋。

+0

很抱歉,但如果你主張Common.getMD5HexDigest(文件)返回一個唯一的哈希我不信任你。 – jarnbjo 2012-02-20 17:19:38

+0

@jarnbjo我用方法代碼更新了問題。 – Ben 2012-02-20 17:29:25

+0

所以你正在使用的散列不僅僅是非唯一的,而且也是不正確的。 – jarnbjo 2012-02-22 10:58:45

回答

0

經過幾個星期的MD5校驗和問題(以驗證文件內容是否隨時間改變)後,我提出了一個不依賴於文件的MD5校驗和的解決方案,但在客戶端文件的last-update屬性。

該解決方案去給大家,希望檢查文件是否已隨時間發生變化。然而,任何操作系統上的「更新」可被視爲打開文件並將文件保存,使用或不使該文件的內容進行任何更改的行爲。所以,這並不完美,但可以節省一些時間和帶寬。

解決方案:

long lastModified = new DateTime(
    new Date(file.lastModified()), TimeZone.getDefault() 
).getValue(); 

if(lastModified > entry.getUpdated().getValue()) { 
    //update the file 
} 

哪裏file是所需文件的File實例,entry是關聯到本地文件DocumentListEntry

0

我猜想,你需要校驗設置爲文件的內容,在路徑名不哈希的MD5哈希值。

爲什麼他們(谷歌)所關心的路徑?這根本沒有意義。如果我誤解了你的代碼,請原諒我,但我認爲你錯誤地理解了文件校驗和的概念。

無論如何,你需要做的是吃(摘要)的文件,而不是路徑:

import java.security.*; 
    import java.util.*; 
    import java.math.*; 
    import java.io.*; 

    public class MD5 { 
     private MessageDigest mDigest; 
     private File   openFile; 
     private FileInputStream ofis; 
     private int    fSize; 
     private byte[]   fBytes; 

     public MD5(String filePath) { 
      try { mDigest = MessageDigest.getInstance("MD5"); } 
      catch (NoSuchAlgorithmException e) { System.exit(1); } 
      openFile = new File(filePath); 
     } 
     public String toString() { 
      try { 
       ofis = new FileInputStream(openFile); 
       fSize = ofis.available(); 
       fBytes = new byte[fSize]; 
       ofis.read(fBytes); 
      } catch (Throwable t) { 
       return "Can't read file or something"; 
      } 

      mDigest.update(fBytes); 
      return new BigInteger(1, mDigest.digest()).toString(16); 
     } 
     public static void main(String[] argv){ 
      MD5 md5 = new MD5("someFile.ext"); 
      System.out.println(md5); 
     } 
    } 

所以在上面的代碼段錯誤是在這裏:

messageDigest.update(String.valueOf(file.hashCode()).getBytes()); 

現在,我可以證明,我的課給文件這是最有可能你所需要的正確的md5sum。只要閱讀方法的javadoc的,如果你不相信我: http://gdata-java-client.googlecode.com/svn/trunk/java/src/com/google/gdata/data/docs/DocumentListEntry.java 什麼它說的是: *設置文檔中計算的MD5校驗。 ......一無所知路徑的校驗:)

這裏:

$ echo "Two dogs are sleeping on my couch" > someFile.ext  
$ echo "Two dogs are sleeping on my couch" |md5sum 
1d81559b611e0079bf6c16a2c09bd994 - 
$ md5sum someFile.ext 
1d81559b611e0079bf6c16a2c09bd994 someFile.ext 
$ javac MD5.java && java MD5 
1d81559b611e0079bf6c16a2c09bd994 
+0

實際上,我現在看到您正在從Java的hashCode字符串中取得md5總和而不是路徑。這是完全錯誤的。你需要md5-checksum-hash文件的肉體而不是一些隨機的整數或任何File.hashCode()創建的。 – 2012-02-27 01:19:02

+0

已經這樣做了,總是返回'null'。我猜目前不支持'setMD5Checksum'方法。 – Ben 2012-02-27 16:04:11