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