1

我对图像感兴趣,但问题很笼统。我这样做是这样的

private static final SecureRandom RANDOM = new SecureRandom();
private static final int FILENAMElENGTH = 73; // a guess
private static String nextId() { // synchronized ?
    return new BigInteger(FILENAMElENGTH, RANDOM).toString(32);
} // https://stackoverflow.com/a/41156/281545

问题 :

  • 使用会话 id + 时间戳存储文件有优缺点吗?优点是稍后使用此信息,缺点是安全性
  • 是否有任何标准(参见 servlet API 或 Java)生成名称的方式?有什么标准做法吗?任何容器特定提示(glassfish 和 tomcat)

我了解保留原始文件名、用户名等可能会导致安全漏洞

有关的 :

4

2 回答 2

2
static File getImageFile() throws IOException {
    return File.createTempFile("upload_", ".jpg", new File(upload_path));
}

// String filename = getImageFile().getName(); 

这保证是唯一的(docs) - 它根本不是 tmp 文件(前提是您可以控制upload_path,它必须是现有目录的路径(尽管文档对此没有明确说明))。

显然,您应该有更好的方法来指定扩展名,但这是另一个问题。

没有会话 ID、用户输入等。

从 BalusC 博客文章中得到这个想法:

还需要知道 MultipartMap 中的文件上传位置,因为我们可以使用 File#createTempFile() 创建具有唯一文件名的文件,以避免它们被另一个(巧合)同名的文件覆盖. 在 servlet 或 bean 中获得上传的文件后,您可以随时使用 File#renameTo() 进行快速重命名/移动。

请注意,createTempFile在 Java 6.11 之前它曾经是相当不安全的(请参阅此处了解说明,此处了解 tmp 文件安全性的一般说明)。另请参阅此 SO question - 文件创建和打开之间存在漏洞窗口。然而,这些问题与文件名无关 - 仍然createTempFile是保证唯一性的唯一方法(我希望您使用最新的 JDK,以避免createTempFile遭受可预测的文件名)。

于 2013-11-07T14:15:29.907 回答
0

您可能想要使用Universally Unique Identifier。它们在 Java 7 中得到很好的支持。如果你使用静态方法UUID.randomUUID(),你应该有一个合理的唯一标识符。请注意,理论上您可能会遇到重复项,但这种可能性非常小,以至于它被认为是您尝试做的非常强大的解决方案(请参阅维基百科链接上的讨论)。

请注意,生成的字符序列根本不是用户友好的,但根据我对您的要求的理解,没关系。

祝你好运!

于 2013-11-03T09:36:47.577 回答