如何确定文件在 Java 中的 Azure 文件存储上是不是完整?

Posted

技术标签:

【中文标题】如何确定文件在 Java 中的 Azure 文件存储上是不是完整?【英文标题】:How to determine if a file is complete on Azure File Storage in Java?如何确定文件在 Java 中的 Azure 文件存储上是否完整? 【发布时间】:2020-08-18 22:48:11 【问题描述】:

对于我们的项目,我们使用 Azure 文件存储,其中可以上传大文件(最多 500 MB),并且必须由 Java 微服务(基于 Spring Boot)通过使用 Azure SDK for Java 进行处理,该 SDK 会定期轮询目录以查看是否已上传新文件。 是否有可能在某些方面确定上传的文件何时完全上传,而无需监控大小等明显的解决方案?

【问题讨论】:

您使用文件存储而不是 Blob 存储是否有原因? 您可以使用散列算法和散列(sha1、md5 等)来确定文件的完整性。 @GauravMantri-AIS 旧版访问,我不得不使用它,因为另一个系统将文件放在那里。 @ControlAltDel 不幸的是,这不是我可以控制的,文件是由另一个系统放置的。 【参考方案1】:

很遗憾,无法直接监控文件上传何时完成(包括监控大小)。这是因为文件上传分两个阶段进行:

    首先,创建一个特定大小的空文件。这映射到Create File REST API 操作。 接下来,将内容写入该文件。这映射到Put Range REST API 操作。这是将实际数据写入文件的位置。

假设数据按顺序写入文件(即从字节 0 到文件大小),一种可能性是继续检查文件的最后“n”个字节,看看它们是否都是非零字节。这表明文件末尾已经写入了一些数据。同样,这不是一个万无一失的解决方案,因为可能存在最后“n”字节真正为零的情况。

【讨论】:

谢谢,这是我最初的设想。目前我赞成您的解决方案,我将在本周晚些时候接受它。 不客气。不急于接受答案:)。有人可能会想出更好的解决方案。 @apetrelli 如何知道此时文件是否未被 REST API 写入?我们可以检查任何类型的锁定状态吗?一种方法是检查 size 和 lastModifiedAt 是否在 3-5 秒后没有改变,不确定它是否一直正确。 我明白你检查最后“n”个字节是否为零的意思。有没有办法在不流式传输整个内容的情况下做到这一点,比如 ReadRange(start, end)? @GautamKumarSamal 系统对我们来说是透明的。然而,最后我们注意到系统使用随机名称传输文件,并且只有在所有文件传输完毕后才重命名为最终形式,因此我们使用这种机制来了解文件何时完成。但是,此行为绑定到特定的上传者,它不是通用的。

以上是关于如何确定文件在 Java 中的 Azure 文件存储上是不是完整?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AppendBlob/大于 4mb 限制的文件上传到 Java 中的 Azure 存储/Blob?

有没有办法确定 Azure 认知搜索中的索引器索引了哪些文件?

按计划删除 Azure 存储中的所有文件

如何通过 Microsoft Azure Query 从 json 文件中的数组中获取数据

Azure synapse 中的两次复制(暂存复制 + 普通复制)如何比普通复制更优化

如何从 Java 中的 Azure Blob 存储中读取文件夹结构为“dir1 / dir2 / dir3 / 20210301-20210331”的 csv 文件?