在PHP中处理临时文件情况的好方法

在PHP中处理临时文件情况的好方法,php,image,upload,temporary-files,Php,Image,Upload,Temporary Files,我有一个PHP脚本,用户可以上传图像。此映像存储在临时目录中,并返回给用户。然后,用户可以使用javascript界面裁剪图像。(x1,y2)(x2,y2)被发送到用于裁剪图像的脚本。然后返回给用户进行另一次预览和/或裁剪。一旦用户足够满意,他将单击“保存”。临时文件被复制到原始文件,临时文件被删除。这些不是每个用户的图像,而是设备的图像。组织中的任何用户都可以替换设备的任何映像。这种方法很好,但有几个问题: 1) 假设用户上传了一张图片进行预览,然后关闭了浏览器窗口。我会留下一个临时文件。这可

我有一个PHP脚本,用户可以上传图像。此映像存储在临时目录中,并返回给用户。然后,用户可以使用javascript界面裁剪图像。(x1,y2)(x2,y2)被发送到用于裁剪图像的脚本。然后返回给用户进行另一次预览和/或裁剪。一旦用户足够满意,他将单击“保存”。临时文件被复制到原始文件,临时文件被删除。这些不是每个用户的图像,而是设备的图像。组织中的任何用户都可以替换设备的任何映像。这种方法很好,但有几个问题:

1) 假设用户上传了一张图片进行预览,然后关闭了浏览器窗口。我会留下一个临时文件。这可能成为一个问题。当然,我可以让一个CRON来清理它们,但理论上我可以有大量的临时文件(这很难看)。cron还可以在编辑过程中删除用户的临时文件

2) 为了处理1号问题,我可以始终为每件设备创建一个临时文件,例如equip1.temp和equip1.jpg。所有上传都存储在equip1.temp中,所有提交都传输到equip1.jpg。如果两个用户试图同时上传同一台设备的图片,这可能会把他们搞砸(可能性很小+不是问题,但仍然很难看)

3) 我总是可以来回传递图像(用户“上传”图像,并将其作为
返回。生成的编辑+原始base64字符串被发送回PHP进行处理)。此解决方案缓解了临时文件问题,但我注意到来回发送高分辨率图像需要几秒钟的时间


您将如何处理这种情况?

我也有类似的问题。如果我没记错的话(已经有一段时间了),我最终在数据库中创建了一个表来存储文件名和会话键/时间。每次加载脚本时,如果数据库中存在死会话,则会删除相应的会话和图像/文件

我不知道这是不是一个好的解决方案,但它解决了我的多用户访问问题。

基于您提到的原因,我不推荐#3

我建议你这样做:

  • 用户将文件上载到随机临时名称
    equip1.jpg
    存储为
    equip1\u fc8293ae82f72cf7.jpg
    。确保您的脚本将同时处理两个文件名。它将允许两个用户上传相同的设备,最后一个上传的用户将成为赢家,但在上传过程中不会发生冲突
  • 每次裁剪器处理临时图像时,您应该“触摸”它以更新修改的时间
  • 让用户完成编辑,移动临时文件以代替最终图像名称
  • 有一个cron,或者你的上传程序脚本的一部分,可以删除mtime超过一小时左右的废弃临时文件。你认为这很混乱,因为可能会有很多临时文件,但是你认为会有很多图像被丢弃吗?垃圾收集是解决这个问题的一种非常标准的方法

  • 使用选项#2,但也要在文件名中包含
    用户id
    ,如
    equip1-user123.temp
    。如果user123离开计算机再也不回来怎么办?临时文件将永远挂起。对于N个多用户,有N*个quip文件如果允许用户一次只编辑一个图像,则可以将文件名保存在用户表中。然后定期运行cron,删除用户表中不存在的任何文件。好主意。我该如何处理用户编辑图像然后离开的问题?该文件将无限期地位于用户表中。如果所有N个用户都这样做,我仍然有相同的问题。相反,我有一个Con只需删除每秒X的临时文件,用户就可以在编辑的中间进行编辑。你需要一个<代码>最后的登录时间戳。一两个月后,用户没有登录,请删除他的临时文件。如果用户上传、裁剪、预览,直到>一个小时(他必须参加会议)才提交,那么他的工作就会丢失。我说了一个小时,因为我觉得你最关心的是空间。您可以将其设置为24小时以上。在某些情况下,如果用户在周末后回来,您将不得不处理该错误,但它可以很好地处理大多数情况。