文件上传时我遇到了一个非常恼人的问题。
用户可以在html文件字段中选择文件。提交表单时,将上传此文件。
在服务器端,我只使用标准的PHP代码(move_uploaded_file)。我什么都不做。
一切都很完美。
我可以在服务器上看到该文件,我可以再次下载,...
但有时这不起作用。我上传文件,处理它,我没有错误。
但该文件在服务器上不存在。
每次上传该特定文件时,我都没有错误,但它永远不会被保存。
只有重命名它(例如test.file到tst.file)我才能上传它,它实际上会被保存。
我很少遇到这个问题。重命名始终有效。但我不能要求用户明显重命名他们的文件......
我无法访问apache tmp文件目录,无法访问日志或设置,因此这使调试更加困难。我在这个特定的服务器上只有这个问题(我没有管理;我甚至无法访问它)而且我在许多没有这个问题的服务器上使用完全相同的代码。
如果有人能帮助我或指出我正确的方向,我将不胜感激。
答案 0 :(得分:2)
尝试添加此调试代码:
echo '<pre>';
print_r($_FILES);
echo '</pre>';
您应该会看到错误编号。您可以在http://uk3.php.net/manual/en/features.file-upload.errors.php
查找其含义也可能值得检查以确保目标文件尚不存在。
答案 1 :(得分:2)
我的第一个想法是文件大小问题。在php.ini中,如果post_max_size或upload_max_filesize太小,你可能会得到类似的结果 - 文件似乎消失了。你会在apache日志中遇到错误(你提到你无权访问)。
在这些情况下,$ _FILES数组只是空的 - 好像文件永远不会到达。由于您对Gumbo和James Hall的回复表明php正在报告正确的上传,因此我对您提及的处理感到疑惑。
如果在此过程中,您的内存最大化或脚本运行时间太长,脚本可能会在有机会移动之前消失。你想检查这些:
memory_limit的
的max_execution_time
max_input_time设置
否则,如果没有apache日志,我会说在整个文件处理脚本中开始输出自己的日志文件可能是个好主意。尝试tmp文件中的file_exists,查看可以从文件中获取的信息(权限等)。
不幸的是,在上传完成之前,PHP不会介入,这意味着您不会在事件发生之后获得太多信息。您最好的选择可能是与托管公司交谈并获取日志 - 即使是很短的时间。根据我的经验,我很少遇到日志 - 或者至少在我运行测试时(在共享服务器没有拆分日志的情况下让技术人员为我检查日志)看起来很荒谬,但是我之前见过它。)
编辑:我意识到你无法改变那些php设置,但你可能想看看它们是什么,以便找出它们是否是你脚本的潜在问题。例如,如果处理器脚本小于上传文件的大小,则内存限制将会终止。
答案 2 :(得分:1)
如果上传失败,则不会出现类似PHP语法错误等错误。
但您可以查看file upload status并自行向用户报告错误。
答案 3 :(得分:1)
这就是你说的......
“我无法访问apache tmp文件目录,无法访问日志或设置,因此这使得调试更加困难。我在这个特定服务器上只有这个问题(我没有管理;我甚至都没有有权访问它)我在很多没有这个问题的服务器上使用完全相同的代码。“
根据您上面所说的,我假设您使用的是许多用户共享的服务器。如果此服务器的Apache配置了类似“mod_suphp”的内容,那么您的PHP脚本将使用您的UNIX用户帐户(例如“jef1234”)的权限执行,这意味着您创建的文件将包含您(“ jef1234“)作为所有者(而不是”apache“或”www-data“)。
系统的临时目录(通常为“/ tmp”)通常配置为“粘滞位”。这意味着每个人都可以在此目录中创建文件,但创建的文件只能由所有者访问(您可以将其视为创建它的人)。
因此,如果服务器配置不够谨慎,您可能会将文件命名与其他用户的文件冲突。例如,当您上传“test.file”时,如果另一个用户已经上传了另一个同名文件,系统将拒绝覆盖他创建的文件,因此您必须使用其他名称。
通常问题不存在,因为PHP足够聪明,可以为上传的文件生成临时名称(即$ _FILES [“html_form_input_name”] [“tmp_name”])。如果以某种方式你可以确认这是真正的原因,服务器显然是错误的配置。告诉系统管理员问题是要求他解决问题。如果无法解决这个问题,你可以在上传之前对文件名做一些JavaScript技巧(未测试,只是一个想法)......
★当用户提交表单时,将文件从例如“test.file”重命名为“jef1234-test.file-jef1234”。上传文件后,将文件(即move_uploaded_file())移动到另一个位置,并通过删除添加的字符串将其重命名为原始文件名。
希望这会有所帮助......
Asuka Kenji