2011-04-10 83 views
1

我的servlet使用FileInputStream.read()从二进制文件读取。如果文件结束,则返回-1。然后它通过响应流将文件的字节发送到客户端。如何通过网络发送文件时指定文件结尾

我想通过响应流发送文件的md5哈希字节。我应该如何从文件的md5中分割文件的结尾,以便客户端知道哪些字节是哪些字节?我无法发送-1字节,因为流停止工作。

是否有任何其他字节可以发送信号结束文件,我知道不可能在实际文件中,因此在文件实际结束之前不可能指示文件结束?

回答

0

首先发送MD5哈希,因为它具有已知长度。

+0

不能 - 我在发送文件时对文件进行哈希处理。如果我先将文件散列为无效,然后通过整个文件两次进行散列和发送? – twisted 2011-04-10 20:07:43

+1

其实你仍然可以在最后加入它。毕竟,你知道最后的128位代表散列。 – 2011-04-10 20:13:13

+0

哦,你是白痴:P。谢谢 – twisted 2011-04-10 20:14:37

2

假设您可以依赖文件不改变,我会读取文件一次并计算MD5哈希值,将其设置为标头,然后将文件写入完整主体。这对于客户来说可能比分裂成两部分更容易。

如果文件足够小,您可以在读取/散列时将其写入ByteArrayOutputStream,以避免必须读取两次 - 但如果文件很大,则可能不想读取该内存击中。

另一种选择是将散列存储在文件系统中 - 首先编写该文件负责散列它。这样你只需要散列一次;你可以随时将它散列为,如果需要的话验证散列。

1

其他答案是好的 - 我只是提到这个给你另一个观点。您可以在您的servlet名称空间中将MD5散列作为单独的资源。

E.g.你的客户端请求“路径/下载文件”下载文件,“路径/下载文件.md5”获取md5。计算MD5的代码可以在文件下载时写入文件系统,或者将散列存储在缓存中(可能是持久存储)。

在其基本形式中,假设客户端将在md5之前下载文件。你可以进行检查以确保是这种情况。另一种方法是根据需要计算md5,但如果客户端在文件之前请求md5,则会出现您希望避免的双读低效。在下载文件后强制要求md5被请求避免这种情况。