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

时间:2012-10-04 16:34:25

标签: php image upload temporary-files

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

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

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

3)我总是可以来回传递图像(用户“上传”图像,它会以<img src="base64....." />的形式回显。生成的编辑+原始base64字符串将被发送回PHP进行处理)。此解决方案缓解了临时文件问题,但我注意到来回发送高分辨率图像需要几秒钟。

你会如何处理这种情况?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

由于你提到的原因,我不推荐#3。

我建议你这样做:

  1. 用户将文件上传到随机临时名称。 equip1.jpg被存储为equip1_fc8293ae82f72cf7.jpg。确保你的脚本会兼顾两个文件名。这将允许两个用户上传相同的设备,最后一个上传是赢家,但在此过程中没有冲突。
  2. 每当裁剪器使用临时图像时,您应该“触摸”它以更新修改时间。
  3. 让用户完成编辑,移动临时文件代替最终图像名称。
  4. 拥有一个cron或上传器脚本的一部分,用于删除mtime超过一小时左右的废弃临时文件。你建议这很麻烦,因为很多临时文件的潜力,但你是否期望放弃很多图像?垃圾收集是解决此问题的一种非常标准的方法。