2012-02-20 3 views
2

Недавно я внедрил приложение в Java, которое использует Google Docs API v3.0. Новые записи создаются следующим образом:Google Docs API «setMd5Checksum» не работает

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 хэш шестнадцатеричного.

Теперь файл загружается должным образом при извлечении файла и проверке контрольной суммы MD5 с помощью метода entry.getMd5Checksum(), он всегда возвращает null.

Я пробовал все, даже установить ETag, ResourceID и VersionID, но все они получают переопределение со значениями по умолчанию (null или сервер генерируемых строк).

+0

Извините, но я не доверяю вам, если вы утверждаете, что Common.getMD5HexDigest (файл) возвращает уникальный хэш. – jarnbjo

+0

@jarnbjo Я обновил вопрос с помощью кода метода. – Ben

+0

Итак, хэш, с которым вы работаете, не просто не уникален, но и неправилен. – jarnbjo

ответ

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 содержимое файла, а не хэш путь-имя.

Зачем им (google) заботиться о пути? Это не имеет никакого смысла. Простите меня, если я неверно истолковал ваш код, но, думаю, вы ошибочно поняли концепцию контрольных сумм файлов.

Во всяком случае, то, что вам нужно сделать, это есть (переваривать) файл, а не путь:

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

Фактически, теперь я вижу, что вы делаете сумму md5 из строки hashCode Java, а не по пути. Это совершенно неправильно. Вам нужно md5-checksum-hash плоть файла, а не какое-то случайное целое или что-то вроде File.hashCode(). –

+0

Сделал это уже, всегда возвращает 'null'. На мой взгляд, метод setMD5Checksum' на данный момент не поддерживается. – Ben

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