Google Docs API“setMd5C​​hecksum”无效

时间:2012-02-20 17:09:17

标签: java md5 google-docs-api

最近,我在Java中实施了一个使用Google Docs API v3.0的应用程序。新条目的创建方式如下:

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或服务器生成的字符串)覆盖。< / p>

2 个答案:

答案 0 :(得分:0)

在使用MD5校验和问题几周后(为了验证文件的内容是否随时间发生变化),我想出了一个不依赖于文件的MD5校验和但在客户端上的解决方案{ {1}}文件的属性。

此解决方案适用于想要检查文件是否随时间发生变化的所有人。但是,任何操作系统上的“更新”都可以被视为打开文件和保存文件的行为,无论是否对文件内容进行任何更改。所以,它并不完美,但可以节省一些时间和带宽。

解决方案:

last-update

其中long lastModified = new DateTime( new Date(file.lastModified()), TimeZone.getDefault() ).getValue(); if(lastModified > entry.getUpdated().getValue()) { //update the file } 是所需文件的file实例,File是与本地文件关联的entry

答案 1 :(得分: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