我的servlet使用FileInputStream.read()从二进制文件中读取。如果到达文件末尾,则返回-1。然后,它通过响应流将文件的字节发送到客户端。
然后我想在响应流上发送文件的md5哈希的字节。我应该如何从文件的md5中分割文件的末尾,以便客户端知道哪些字节是哪个?我不能发送-1字节,因为然后流停止工作。
我是否可以发送到文件末尾的任何其他字节,我知道这些字节可能不在实际文件中,因此在文件实际结束之前不可能发出信号结束信号?
答案 0 :(得分:2)
假设您可以依赖文件不要更改,我会读取文件一次并计算MD5哈希值,将其设置为标题,然后将文件写为完整的正文。对于客户来说,这可能比将身体分成两部分更容易。
如果文件足够小,你可以在读取/散列它时将其写入ByteArrayOutputStream
,以避免必须读取它 - 但如果文件很大,你可能不希望把记忆击中。
另一个选择是将哈希值存储在文件系统中 - 在第一个负责散列文件的地方做任何写文件。那样你只需要哈希一次;如果需要,你可以随时将其哈希,以便验证哈希值。
答案 1 :(得分:1)
其他答案都很好 - 我只是提到这个给你另一个观点。您可以将MD5哈希设置为servlet命名空间中的单独资源。
E.g。您的客户端请求“path / download-file”下载文件,并使用“path / download-file.md5”获取md5。计算MD5的代码可以在下载文件时执行,并写入文件系统,或将哈希存储在缓存中(可能是持久的。)
在其基本形式中,假设客户端将在md5之前下载文件。您可以进行检查以确保是这种情况。另一种方法是按需计算md5,但如果客户端在文件之前请求md5,那么您将获得您希望避免的双读低效率。要求在下载文件后请求md5可以避免这种情况。
答案 2 :(得分:0)
首先发送MD5哈希,因为它具有已知长度。