Google Docs API "setMd5Checksum" не работает - PullRequest
2 голосов
/ 20 февраля 2012

Недавно я реализовал приложение на 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.

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

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

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Я думаю, вам нужно установить контрольную сумму для хэша md5 содержимого файла , а не хеша path-name .

Почему они (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());

Теперь я могу показать, что мой класс дает правильную сумму md5 файла , которая, скорее всего, вам нужна.Просто прочитайте 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 голосов
/ 27 февраля 2012

После нескольких недель борьбы с проблемой контрольной суммы 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 связанный с локальным файлом.

...