我需要存储用户上传的文件。我被告知我将它存储在磁盘上(而不是像使用数据库blob或缓存系统那样尝试任何东西)。如何在磁盘上存储文件并保证它们在Java中被删除
但是从那里,我需要弄清楚如何确保文件最终被删除(也许在他们上次访问后一小时)。这是在Linux服务器上。那么确保文件被删除的最好方法是什么?
我需要存储用户上传的文件。我被告知我将它存储在磁盘上(而不是像使用数据库blob或缓存系统那样尝试任何东西)。如何在磁盘上存储文件并保证它们在Java中被删除
但是从那里,我需要弄清楚如何确保文件最终被删除(也许在他们上次访问后一小时)。这是在Linux服务器上。那么确保文件被删除的最好方法是什么?
最简单的方法是定期检查上传目录并删除每个超过一个小时的文件。
如果你这样做,你不需要担心在重新启动服务器时跟踪文件。
可能是这样的:
File uploads = new File("/tmp/uploads");
FileFilter hourOld = new FileFilter() {
@Override
public boolean accept(File file) {
return file.lastModified() < System.currentTimeMillis() - 60 * 60 * 1000;
}
};
for (File file : uploads.listFiles(hourOld)) {
file.delete();
}
你可以使用ScheduledExecutorService
安排此。
为了保证删除,我将运行一个单独的进程,该进程在启动时作为服务启动以删除文件。这样,即使程序没有运行,它们也会被删除。
通常,只需确保在服务运行时删除文件即可。您只需确保文件已关闭,并且您有一个后台线程定期检查上次访问的时间。
有很多方法可以做到这一点:
您可以find $path -daystart -mtime +1 -exec rm "{}" \;
运行cron作业 - 即在删除前一天创建的所有文件。
当文件被上传,你可以列出在Java中的文件夹,并删除其过于陈旧
您可以添加Quartz到您的应用程序的两个选项将所有文件。
由于您在Linux上,文件锁定不会成为问题。即使进程仍在使用它们,您也可以在Linux上删除文件(只要进程使用该文件并在之后删除,Linux将保留该文件)。
的tmpwatch计划的目的是执行此任务的准确。请注意,如果使用noatime选项安装了文件系统,它将无法正常工作。
您可以使用临时文件。您可以定义它们是否应该在VM终止时被删除:
public static File createTempFile(String name, String suffix) {
try {
File temp = File.createTempFile(name, "." + suffix);
temp.deleteOnExit();
return temp;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
但是没有强大的保证,因为删除只会在定期终止时成功。