2011-03-14 50 views
3

我正在从其用户每天接收约500张照片上传的网站中工作。虽然这不是一个很高的数字,但我们正在经历不同上传之间的一些冲突。有些用户报告看到另一张照片的缩略图,而不是他们上传的照片。我一直在寻找这个问题的解释,我发现在计算器几个问题:适用于处理大量文件上传的技术

PHP temp file names for uploads colliding

PHP file uploads being "hijacked" by partial uploads

正如我已阅读,这个问题似乎是相关的碰撞在文件tmp名称中。为了避免这种情况,我们考虑改变upload_tmp_dir PHP变量,这取决于从记录的用户名计算出来的整数,以减少碰撞概率。但是,该变量在运行时不可更改,因为PHP开始执行时,该文件已经发布到服务器。

我不知道如何解决这个问题,我想解决它,以防止日后上传速度不断增加的未来问题。

有很多处理大量上传的网站,所以我不知道如何避免碰撞问题。我工作的网站运行在PHP 5.2.14上。为了简单起见,我更喜欢PHP解决方案,但我也对现有的使用其他脚本语言的解决方案感兴趣,只要它们保证上载之间不会发生冲突。

回答

1

问题也可能在于你的DBlogic。一种安全的方法是向数据库插入一行,获取记录的主键。使用该号码作为文件名将防止冲突。你可以这样做:

LOCK TABLES image WRITE; 
INSERT INTO image (id) VALUES (NULL); 
SELECT LAST_INSERT_ID(); 
UNLOCK TABLES; 

然后有你的(auto_increment)ID。您可以将其余数据(例如标签保存到不同的表格)并处理您的文件,并且名称不会相互冲突。

+0

我们使用原始照片名称+时间戳作为后缀来创建文件名。当获得$ _FILES ['tmp_name']字段vlue时,碰撞似乎发生。 – 2011-03-15 11:06:14

+0

APC有能力跟踪上传进度。也可以代替PHP的临时名称生成例程。值得一试。 (虽然它可以产生具有关机功能的怪异东西。) – vbence 2011-03-15 14:47:04