PHP版Google App Engine createUploadUrl多文件上传仅保留首个文件问题咨询
我之前也踩过这个坑!GAE PHP环境的createUploadUrl在处理单个multiple类型的文件字段时确实有这个限制——它的上传处理逻辑默认只会提取该字段下的第一个文件,剩下的都会被直接丢弃,这和常规PHP环境的处理逻辑不一样,也是为啥你提交到其他服务能正常工作的原因。
下面给你两个可行的解决办法:
解决方案1:改用数组式的文件字段命名
这是最省心的办法,把原来的单个多文件字段改成数组命名形式,让GAE能正确识别每个上传的文件。
修改你的表单代码:
<form action="<?= $uploadUrl ?>" method="post" enctype="multipart/form-data"> <!-- 把name属性改成数组格式 --> <input type="file" name="upload_files[]" multiple> <button type="submit">上传文件</button> </form>
后端处理时,$_FILES['upload_files']就会变成包含所有文件信息的数组,你可以正常遍历处理:
// 此时var_dump会输出所有上传的文件 var_dump($_FILES['upload_files']); // 遍历处理每个文件的示例 foreach ($_FILES['upload_files']['tmp_name'] as $index => $tmpName) { $fileName = $_FILES['upload_files']['name'][$index]; $fileSize = $_FILES['upload_files']['size'][$index]; // 这里写你的文件处理逻辑,比如移动到云存储等 }
解决方案2:手动解析原始请求数据
如果必须保留单个multiple字段的形式,可以绕过GAE对$_FILES的处理,直接读取原始请求数据来解析所有文件。
示例代码(简化版的multipart解析逻辑):
// 读取原始请求内容 $rawRequest = file_get_contents('php://input'); // 获取multipart分隔符 $boundary = substr($_SERVER['CONTENT_TYPE'], strpos($_SERVER['CONTENT_TYPE'], '=') + 1); // 分割所有表单部分 $parts = explode("--$boundary", $rawRequest); $uploadedFiles = []; foreach ($parts as $part) { // 跳过无效的部分 if (strpos($part, 'Content-Disposition: form-data') === false) { continue; } // 提取文件名 preg_match('/filename="([^"]+)"/', $part, $filenameMatch); if (empty($filenameMatch[1])) { continue; } // 提取文件内容 $contentStart = strpos($part, "\r\n\r\n") + 4; $fileContent = substr($part, $contentStart); // 去除末尾的分隔符标记 $fileContent = rtrim($fileContent, "\r\n--"); $uploadedFiles[] = [ 'name' => $filenameMatch[1], 'content' => $fileContent // 若需要临时文件,可以把内容写入tmp目录,生成tmp_name ]; } // 输出所有上传的文件信息 var_dump($uploadedFiles);
额外提示
- 可以检查一下GAE应用的
php.ini配置,确保upload_max_filesize和post_max_size的值足够容纳多个文件的总大小; - 如果使用的是较旧版本的GAE PHP runtime,尝试升级到新版本,说不定官方已经修复了这个问题。
内容的提问来源于stack exchange,提问作者Sam Johnson
相关产品推荐
相关产品推荐

