PHP多文件上传至文件夹失败,error字段为1求助
解决多文件上传时error全为1的问题
嘿,刚接触PHP遇到上传问题很正常,先帮你拆解一下:你看到的error字段值为1,对应PHP的UPLOAD_ERR_INI_SIZE常量,意思就是你上传的文件超过了服务器php.ini配置里允许的最大文件大小。下面咱们一步步解决问题,顺便修正代码里的小问题:
第一步:先排查服务器配置
首先得检查php.ini里的几个关键配置(如果找不到php.ini位置,可以新建一个php文件写<?php phpinfo(); ?>运行后查看):
upload_max_filesize:单个文件允许的最大上传大小,默认一般是2M或者8M,你可以根据需要改成10M这类更大的值post_max_size:整个POST请求的总大小,这个必须比upload_max_filesize大,因为表单除了文件还有其他字段内容,比如设成12M就很合适max_file_uploads:允许同时上传的文件数量,默认是20,你的3个文件完全没问题,但可以确认一下
修改完这些配置后,记得重启你的Web服务器(Apache或者Nginx),不然配置不会生效。
第二步:修正代码结构问题
你的代码把上传处理的PHP逻辑直接写在了<form>标签里面,虽然加了isset判断不会报错,但这不是正确的写法——应该把处理逻辑放在页面最顶部,在输出任何HTML之前,这样表单提交后能第一时间处理上传。另外还有个小问题:你的复选框name="tags"应该改成name="tags[]",不然只能拿到最后一个选中的标签。
修正后的完整代码:
<?php // 先处理上传逻辑,一定要放在输出HTML之前 if(isset($_POST['submit']) && isset($_FILES['file_array'])){ $name_array = $_FILES['file_array']['name']; $tmp_name_array = $_FILES['file_array']['tmp_name']; $error_array = $_FILES['file_array']['error']; // 遍历每个文件,逐个处理错误和上传 foreach($error_array as $key => $error){ if($error === UPLOAD_ERR_OK){ // 没有错误才尝试移动文件 $target_dir = "../project-files/"; // 先检查目标目录是否存在,不存在就创建 if(!is_dir($target_dir)){ mkdir($target_dir, 0755, true); } $target_path = $target_dir . $name_array[$key]; if(move_uploaded_file($tmp_name_array[$key], $target_path)){ echo $name_array[$key] . " 上传完成啦<br>"; } else { echo "文件 " . $name_array[$key] . " 移动失败,可能是权限问题哦<br>"; } } else { // 把错误码转成易懂的提示 $error_msg = match($error){ UPLOAD_ERR_INI_SIZE => "文件 " . $name_array[$key] . " 太大啦,超过服务器允许的最大大小", UPLOAD_ERR_FORM_SIZE => "文件 " . $name_array[$key] . " 超过表单设置的大小限制", UPLOAD_ERR_PARTIAL => "文件 " . $name_array[$key] . " 只上传了一部分,可能是中途断网了", UPLOAD_ERR_NO_FILE => "你没选择文件哦", UPLOAD_ERR_NO_TMP_DIR => "服务器缺少临时文件夹,联系管理员处理吧", UPLOAD_ERR_CANT_WRITE => "无法把文件写到磁盘,可能是目录权限不够", UPLOAD_ERR_EXTENSION => "PHP扩展阻止了这个文件上传", default => "未知错误:" . $error }; echo $error_msg . "<br>"; } } } ?> <?php include ('../includes/Main-header.php'); ?> <form action="" method="post" enctype="multipart/form-data"> <p>Nombre del proyecto</p> <p><input type="text" name="nombre_proyecto" placeholder="Escribe aquí el nombre de tu proyecto..." required></p> <p>Descripción del proyecto</p> <p><textarea name="desc_proyecto" cols="50" rows="10" placeholder="Escribe aquí el contenido que describirá a tu proyecto..."></textarea></p> <p>Construcción del proyecto</p> <p><textarea name="constru_proyecto" cols="50" rows="10" placeholder="Describe cómo se realiza paso a paso éste proyecto..."></textarea></p> <p>Metodología del proyecto</p> <p><textarea name="met_proyecto" cols="50" rows="10" placeholder="Explica a otros docentes con detalle, qué metodología aplica éste proyecto y porqué funcionó..."></textarea></p> <h1>Tags del proyecto</h1> <p>Éstas describirán de qué asignaturas está compuesto el proyecto</p> <p><input type="checkbox" name="tags[]" value="Mecanica">Mecanica</p> <p><input type="checkbox" name="tags[]" value="Electronica">Electronica</p> <p><input type="checkbox" name="tags[]" value="Fisica">Fisica</p> <p><input type="checkbox" name="tags[]" value="Biologia">Biologia</p> <p><input type="checkbox" name="tags[]" value="Anatomia">Anatomia</p> <p><input type="checkbox" name="tags[]" value="Ciencias">Ciencias</p> <p><input type="file" name="file_array[]"></p> <p><input type="file" name="file_array[]"></p> <p><input type="file" name="file_array[]"></p> <div class="submit-class"> <button name="submit" value="submit">¡Compártelo!</button> </div> </form> <?php include('../includes/main-footer.php'); ?>
第三步:额外的优化建议
- 不要直接用用户上传的文件名,最好重命名(比如加上时间戳
time() . "_" . $name_array[$key]),避免文件名重复或者包含特殊字符导致上传失败 - 可以给文件上传框加
accept属性限制类型,比如accept=".pdf,.jpg,.png",减少不必要的错误 - 检查
../project-files/目录的权限,确保Web服务器用户(比如www-data)有读写权限,不然文件移动会失败
内容的提问来源于stack exchange,提问作者RundownSorcerer
相关产品推荐
相关产品推荐

