最近,我在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
。
我已经尝试了一切,甚至设置了ETag
,ResourceID
和VersionID
,但它们都会被默认值(null
或服务器生成的字符串)覆盖。< / p>
答案 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