2017-08-06 3 views
0

J'ai un code assez simple pour télécharger des fichiers sur Google Cloud Storage en utilisant Golang.Comment éviter les téléchargements mal formés?

func upload(object *storage.ObjectHandle, b []byte) error { 
    w := object.NewWriter(context.Background()) 

    if _, err = w.Write(b); err != nil { 
     return err 
    } 
    return w.Close() 
} 

J'ai téléchargé des multitudes de fichiers sans aucun problème, mais hier, j'ai remarqué que l'un des fichiers a été endommagé. Je suis assez certain que le fichier a été endommagé pendant le téléchargement que je nomme les fichiers basés sur le hachage MD5 de son contenu. Je crois que Google Cloud Storage aurait dû renvoyer une erreur lors de l'appel du w.Close() mais ce n'est pas le cas. Quelle est la meilleure façon de s'assurer que le téléchargement échoue toujours lorsque le transfert est interrompu/endommagé?

Répondre

1

Vous pouvez essayer les contrôles suivants avant et après que vous téléchargez les octets:

  • magasin len (b) d'octets
  • magasin SHA256 hash d'octets

Vérifiez que ces deux sont les mêmes lors de la lecture du stockage en nuage directement après. Cela pourrait avoir un impact sur la performance, bien sûr, mais cela vous permettrait de savoir ce que vous mettez dans GCS.

Ce n'est pas le seul endroit où vous pourriez voir la corruption si - si le client a cessé de transmettre ou transmis de mauvaises données à votre serveur, cela ne le détecterait pas. Si c'est le cas, vérifier l'intégrité d'une autre manière avant le téléchargement pourrait être votre meilleur pari. Si vos fichiers sont d'un type connu, vous pouvez également vérifier leur intégrité en vérifiant que c'est vraiment un fichier jpg valide par exemple. Il est peut-être préférable d'essayer de reproduire et de déterminer exactement où la corruption se produit d'abord pour vérifier votre hypothèse selon laquelle GCS aurait dû renvoyer une erreur et corrompre silencieusement les données qui lui ont été données.