2011-04-10 1 views
1

Mon servlet lit un fichier binaire à l'aide de FileInputStream.read(). Cela renvoie -1 si la fin du fichier est atteinte. Il envoie ensuite les octets du fichier au client via le flux de réponse.Comment spécifier la fin du fichier lors de son envoi sur le réseau

Je veux ensuite envoyer les octets d'un hachage md5 du fichier sur le flux de réponse. Comment devrais-je diviser la fin du fichier de la md5 du fichier afin que le client sache quels sont les octets qui? Je ne peux pas envoyer un octet -1 car le flux cesse alors de fonctionner.

Y a-t-il d'autres octets que je peux envoyer pour signaler la fin du fichier que je sais ne pas être dans le fichier réel, et donc ne pas signaler la fin du fichier avant qu'il ne se termine?

Répondre

0

Envoyez d'abord le hachage MD5 car il a une longueur connue.

+0

Je ne peux pas hacher le fichier en l'envoyant. Si je hash le fichier d'abord son inefficace pour parcourir le fichier entier deux fois pour le hachage et pour l'envoi? – twisted

+1

En fait, vous pouvez toujours l'inclure à la fin. Après tout, vous savez que les 128 derniers bits représentent le hachage. –

+0

oh yeh im un idiot: P. Merci – twisted

2

En supposant que vous pouvez compter sur le fichier pour ne pas changer, je lirais le fichier une fois et calculerais le hachage MD5, le définirais comme en-tête, puis écrirais le fichier comme le corps complet. Cela sera probablement plus facile à gérer pour le client que de diviser le corps en deux parties.

Si le fichier est assez petit, vous pouvez l'écrire dans un ByteArrayOutputStream pendant que vous le lisez/le hachez, pour éviter de le lire deux fois - mais si le fichier est volumineux, vous ne voudrez probablement pas prendre cette mémoire frappé.

Une autre option consiste à stocker le hachage dans le système de fichiers - faire écrit le premier fichier responsable du hachage. De cette façon, vous avez seulement besoin de le hacher une fois; vous pouvez toujours le hacher comme vous le lisez à vérifier le hachage si nécessaire.

1

Les autres réponses sont bonnes - je le mentionne juste pour vous donner un autre point de vue. Vous pouvez faire du hachage MD5 une ressource distincte dans votre espace de noms de servlet.

E.g. votre client demande "path/download-file" pour télécharger un fichier, et "path/download-file.md5" pour obtenir le md5. Votre code qui calcule le MD5 peut le faire pendant que le fichier est téléchargé, et écrire dans le système de fichiers, ou stocker le hachage dans un cache (éventuellement persistant.)

Dans sa forme de base, cela suppose que le client téléchargez le fichier avant le md5. Vous pourriez mettre des chèques pour vous assurer que c'est le cas. L'alternative est de calculer le md5 à la demande, mais si le client demande le md5 avant le fichier, alors vous obtenez l'inefficacité en double lecture que vous espériez éviter. Mandater que le md5 est demandé après le téléchargement du fichier évite cela.

Questions connexes