警告:文件上传错误 - 无法在第 0 行的未知中创建临时文件
Posted
技术标签:
【中文标题】警告:文件上传错误 - 无法在第 0 行的未知中创建临时文件【英文标题】:Warning: File upload error - unable to create a temporary file in Unknown on line 0 【发布时间】:2013-08-26 01:15:39 【问题描述】:每次我尝试上传文件时都会收到以下错误。
“”
这是我的 html 表单,
<form action="./inventory_list.php" enctype="multipart/form-data" name="myForm" id="myForm" method="post">
<table border="1" cellpadding="5">
<tr>
<td >Product Name</td>
<td ><input type="text" name="product_name" id="product_name"></td>
</tr>
<tr>
<td>Product Price</td>
<td><label for="textfield2">Rs:</label>
<input type="text" name="price" id="price"></td>
</tr>
<tr>
<td>Category</td>
<td><select name="category" id="category">
<option value="" selected="selected"></option>
<option value="Bedroom ">Bedroom </option>
<option value="Living">Living room</option>
<option value="Dining">Dining</option>
</select></td>
</tr>
<tr>
<td>Sub - Category</td>
<td><select name="subcategory" id="subcategory">
<option value="" selected="selected"></option>
<option value="dinet">Dining tables</option>
<option value="shoe">shoe racks</option>
<option value="wardrobe">wardrobes</option>
<option value="sofa">sofa</option>
</select></td>
</tr>
<tr>
<td>Product Details</td>
<td><textarea name="details" cols="50" rows="10" id="details"></textarea></td>
</tr>
<tr>
<td>Product Image</td>
<td><label>
<input type="file" name="fileField" id="fileField"/>
</label></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="button" id="button" value="Add this Item now"></td>
</tr>
</table>
</br>
</form>
这是我的 PHP 代码,
if(isset($_POST["product_name"]))
$product_name = mysql_real_escape_string($_POST["product_name"]);
$price= mysql_real_escape_string($_POST["price"]);
$category= mysql_real_escape_string($_POST["category"]);
$subcategory= mysql_real_escape_string($_POST["subcategory"]);
$details= mysql_real_escape_string($_POST["details"]);
//see if duplicate product exists
$sql = mysql_query("select id from products where product_name='$product_name' limit 1");
$product_match = mysql_num_rows($sql); //count the output
if($product_match>0)
echo "The product name already exists";
exit();
$sql= mysql_query("INSERT INTO `mystore`.`products` (`product_name`, `price`, `details`, `category`, `subcategory`, `date_added`) VALUES ( '$product_name', '$price', '$details', '$category', '$subcategory', now());")or die(mysql_error());
$pid = mysql_insert_id();
$newname = "$pid.jpg";
move_uploaded_file($_FILES['fileField']['tmp_name'],'../inventory_images/$newname');
我正在尝试在 localhost 上上传, 测试服务器:XAMPP, 操作系统:MAC 10.8
很久以来我一直坚持这一点,我尝试了很多东西,但没有任何效果。
【问题讨论】:
您在 /tmp 中有多少可用空间(或任何 MAC 等价物)?权限呢?网络服务器用户是否有写入权限? @Mike 我怎么找到的? 尝试ls -ld /tmp
查找权限。然后根据该命令的输出确定 Web 服务器用户是什么,并查看它是否有权在此处写入。您可以使用df -h
命令获得可用空间。如果/tmp
未在此处列出,则它没有自己的分区,您将不得不查看根文件系统的可用空间。
【参考方案1】:
在 ../inventory_images/$newname 中使用双引号。
改变这一行
move_uploaded_file($_FILES['fileField']['tmp_name'],'../inventory_images/$newname');
作为
move_uploaded_file($_FILES['fileField']['tmp_name'],'../inventory_images/'.$newname);
注意:
在带有单引号的 php 中 $newname 将显示为字符串。
为了显示变量的值使用双引号
【讨论】:
我已经在您面前发布了相同的答案。不要重复答案。 在凝视的时候没有答案..这是一个共同事件。【参考方案2】:可能是/tmp 目录问题。检查 /tmp 是否具有正确的访问权限和足够的空间大小。
【讨论】:
我调试了一天,/tmp
是可写的,但有时我无法写入并收到警告。在我检查大文件后发现问题是我们写入的内容大小。谢谢@ITemius,你拯救了我的一天【参考方案3】:
更改“上传”目录的权限。您需要先授予 Web 服务器对其的访问权限,然后它才能将文件移动到其中。
将您的上传文件夹权限“Read only
”更改为“Read & Write
”
**Edited**
阅读此link 并阅读此links。它指导您如何更改文件权限。
【讨论】:
如何在 MAC 上执行此操作,我无法找到 /tmp 文件夹。对不起,如果这是一个愚蠢的问题, 检查此链接。并更改您的 inventory_images 文件夹权限【参考方案4】:在终端类型中:
chmod -R 777 /your/upload/folder
您可以通过执行此代码知道您的php上传文件的文件夹:
$tmp_dir = ini_get('upload_tmp_dir') ? ini_get('upload_tmp_dir') : sys_get_temp_dir();
die($tmp_dir);
在我的情况下,我得到/var/...
,所以当我设置 777 权限时,我没有收到任何错误。
编辑
将 777 设置为 /var
很危险,因此您只需将其设置为 php 上传文件的文件夹(您可以购买上面的代码)。
【讨论】:
@brunocascio 上传文件夹因平台而异,在我的情况下,它位于 /var/.... 在/etc/php/7.2/apache2/php.ini
中取消注释sys_temp_dir = "/tmp"
对我有用。
谢谢 pbies。对我来说,它在 Centos7 上的 /etc/php.ini php7.3 中的 /etc/php.ini sys_temp_dir = "/tmp"
对我不起作用,您还有其他解决方案吗?【参考方案5】:
你没有说你的平台是什么,但如果是更高版本的 Fedora (17+),服务文件中 PrivateTmp=true 的设置可能会导致这个问题。在 /etc 中使用 PrivateTmp=false 创建服务文件至少是解决此问题的一种方法,尽管它涉及回滚安全功能。
【讨论】:
你错过了,它在底部:测试服务器:XAMPP,操作系统:MAC 10.8 :)【参考方案6】:您应该检查您的 php.ini 并查找“upload_tmp_dir”选项。默认为空。之后,检查您的 tmp 目录的权限。如果你想知道你的服务器使用的是什么upload_tmp_dir,你可以简单地使用这个sn-p的代码
$tmp_dir = ini_get('upload_tmp_dir') ? ini_get('upload_tmp_dir') : sys_get_temp_dir();
die($tmp_dir);
最后,您可以在终端 shell 中键入:chmod -R 777 'your_tmp_upload_dir'
【讨论】:
【参考方案7】:从 WordPress 上传文件时,我遇到了同样的错误。我在 apache error log file
中遇到了这个错误:
"PHP 警告:文件上传错误 - 无法创建临时文件 未知”。
我通过在/etc/php.ini
中注释掉upload_tmp_dir
来修复错误。 upload_tmp_dir
设置为 /tmp
。我还设置了date.timezone
。重新启动服务器后,我能够从 WordPress 上传媒体文件。
似乎php没有写入/tmp
文件夹的权限。
【讨论】:
【参考方案8】:在我的情况下,这是由于从控制台而不是服务运行 httpd.exe Apache 服务器引起的。
【讨论】:
【参考方案9】:如果你不知道它是什么,那就是 SeLinux。它在某些发行版(如 CentOS)中默认启用。
检查您是否正在运行 SELinux:
sestatus
如果您启用了 SELinux,请使用 chcon
命令修复您的权限。
这只是nginx
的一个例子:
chcon -R -h -t httpd_sys_script_rw_t /usr/share/nginx/tmp
chown -R nginx:nginx /usr/share/nginx/tmp
chmod -R ug+rw /usr/share/nginx/tmp
tmp 目录,chroot 中的上传目录需要设置为 /tmp 而不是完整路径。
【讨论】:
【参考方案10】:对我来说,这个问题是由于服务器上缺少 Inode 而表现出来的:
df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 512K 512K 0 100% /
使用:https://***.com/a/9387415/7637065 识别罪魁祸首目录 并删除了不需要的文件。
【讨论】:
【参考方案11】:如果现有答案都不起作用,那么我遇到的问题是 Windows 文件夹限制为 65,560 个项目。清除文件夹后,它开始重新工作。
【讨论】:
【参考方案12】:-
在 php.ini 中
open_basedir=/tmp:/rootdir
重启apache:systemctl restart apache2
tmp 具有完全访问权限:chmod 777 /tmp
文件夹应该有完全权限:chmod -Rf a+x sites/default/files
【讨论】:
【参考方案13】:当我在 WP 服务器上将外部磁盘安装为 /tmp
时,我遇到了同样的问题。我还看到一些文章建议完整的/tmp
清理(通过rm -rf /tmp/*
)会导致类似的事情。
我花了一段时间才弄清楚如何解决它,因为主要嫌疑人是wp-config.php
和php.ini
。但事实证明这些都是红鲱鱼,而不是设置WP_TEMP_DIR
或创建您的自定义php.ini
(我的图像只有php.ini-development
和php.ini-production
)完全可以。 Wordpress 具有合理的默认行为来识别临时目录。
在操作任何配置之前,请确保您的 /tmp
目录完好无损并且没有任何异常(例如不同的文件系统、符号链接等)
【讨论】:
【参考方案14】:最近在 Laravel 和 Wordpress(php 版本 7.3)中工作时,我收到此错误“文件上传错误 - 无法在第 0 行的未知中创建临时文件”
对我有用的解决方案是。希望这可以帮助任何面临此类问题的人。
Laravel
-
在项目根文件夹中创建一个 tmp 文件夹。确保它正确设置了写入权限。
在公共文件夹中创建 php.ini 文件。
WordPress
-
在项目根文件夹中创建一个 tmp 文件夹。确保它正确设置了写入权限。
在 wp_admin 文件夹中创建 php.ini 文件。
除了您的其他 ini 设置之外,还专门在 php.ini 中添加以下行。
upload_tmp_dir = 开启
upload_tmp_dir = "/path/to/tmp/文件夹"
这里的路径类似于 /home/cpanel username/public_html/folder/project/tmp
注意:如果您在 Laravel 中工作。如果您将文件存储在存储文件夹中,请不要忘记链接存储文件夹。为此,请在终端运行以下命令。
php artisan storage:link
【讨论】:
【参考方案15】:我在 Windows 服务器上使用 PHP,我的解决方案是:
打开“elFinderVolumeDriver.class.php” 并找到该行:
// maximum number of chunked upload connection. `-1` to disable chunked upload
'uploadMaxConn' => 3,
并将值 3 更改为 -1:
// maximum number of chunked upload connection. `-1` to disable chunked upload
'uploadMaxConn' => -1,
在我的情况下,分块上传会导致问题。
【讨论】:
以上是关于警告:文件上传错误 - 无法在第 0 行的未知中创建临时文件的主要内容,如果未能解决你的问题,请参考以下文章
Xampp:作曲家安装问题:模块 openssl 已在第 0 行的未知中加载
Laravel 错误 - 未知:需要打开失败'。 ./public' (include_path='.;C:\php\pear\') 在第 0 行的未知