servlets-为上载的文件选择一个文件名

servlets-为上载的文件选择一个文件名,servlets,file-upload,tomcat7,glassfish-3,servlet-3.0,Servlets,File Upload,Tomcat7,Glassfish 3,Servlet 3.0,我对图像感兴趣,但问题很笼统。我正在这样做: 问题: 使用会话id+时间戳存储文件是否有利弊?优点是在以后使用此信息,缺点是在安全方面 是否有任何标准(参见ServletAPI或Java)方法来生成名称?有什么标准做法吗?任何容器特定的提示(玻璃鱼和tomcat) 我理解保留原始文件名、用户名等会导致安全漏洞 相关的: 您可能需要使用一个。它们很漂亮。如果使用静态方法UUID.randomUUID(),则应该有一个合理唯一的标识符。请注意,从理论上讲,您可能会遇到一个副本,但这种可能性

我对图像感兴趣,但问题很笼统。我正在这样做:

问题:

  • 使用会话id+时间戳存储文件是否有利弊?优点是在以后使用此信息,缺点是在安全方面
  • 是否有任何标准(参见ServletAPI或Java)方法来生成名称?有什么标准做法吗?任何容器特定的提示(玻璃鱼和tomcat)
我理解保留原始文件名、用户名等会导致安全漏洞

相关的:

您可能需要使用一个。它们很漂亮。如果使用静态方法
UUID.randomUUID()
,则应该有一个合理唯一的标识符。请注意,从理论上讲,您可能会遇到一个副本,但这种可能性非常小,以至于它被认为是您尝试执行的操作的一个非常强大的解决方案(请参阅Wikipedia链接上的讨论)

请注意,生成的字符序列一点也不友好,但根据我对您的需求的理解,这是可以的

祝你好运

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

// String filename = getImageFile().getName(); 
这保证是唯一的()-并且它根本不是tmp文件(前提是您可以控制
上传路径,该路径必须是现有目录的路径(尽管文档对此没有明确说明))

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

没有会话ID、用户输入等

从BalusC的博客上得到了这个想法:

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


请注意,
createTempFile
在Java6.11之前是相当不安全的(有关tmp文件安全性的说明和一般说明,请参阅)。还可以看到,在文件创建和打开之间存在一个漏洞窗口。但是,这些问题与文件名无关-仍然
createTempFile
是保证唯一性的唯一方法(我希望您使用的是最新的JDK,以避免可预测的文件名
createTempFile
受到影响)。

这一切都取决于您对这些名称所做的操作。如果将映像公开,并且它包含一个用户的会话ID,那么显然任何人都可以获取另一个用户的会话ID并模拟他。您可以简单地使用数据库序列,和/或散列文件内容以生成唯一的名称。Random也很好,只是它是随机的,因此不能提供强大的唯一性保证。@JBNizet:有任何标准实践吗?像api中的一个方法?什么是db序列?我的用途是保存图片,然后通过
东西显示它(它确实显示会话-ooops!)db序列就是数据库序列。数据库序列类似于计数器,但它是持久的,可以由多个线程甚至应用程序共享,并且即使关闭并重新启动应用程序,也会以最后一个值重新启动。您向数据库请求下一个值,它将返回该值。它通常用于生成主键值。不,没有一种标准做法可以满足您的需要。@JBNizet:您可以发布一些代码来获取这样的序列吗?比如说JDBC/MySQL(答案:),不幸的是,MySQL没有序列。不过,您可以使用自动增量列来模拟它们。谷歌是你的朋友:“MySQL序列”。
static File getImageFile() throws IOException {
    return File.createTempFile("upload_", ".jpg", new File(upload_path));
}

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