通过PDF内嵌表单上传Word/PDF至API后文件无法打开,寻求解决方案
上传文件无法打开问题修复方案
文件无法打开和加密无关,是代码逻辑错误导致传输的内容并非有效文件数据,按以下步骤修复即可:
- 修复请求头设置逻辑
你当前使用header()函数设置的是返回给前端浏览器的响应头,不会传递给你调用的第三方API。如果需要给API传递请求头,需要通过curl的CURLOPT_HTTPHEADER参数配置,示例如下:
// 先动态获取上传文件的真实MIME类型,避免硬编码不兼容PDF格式 $finfo = new Finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($_FILES['file']['tmp_name']); $headers = [ 'Content-Disposition: attachment;filename="' . $_FILES['file']['name'] . '"', 'Content-Type: ' . $mime, 'Content-Transfer-Encoding: binary', 'Expires: 0', 'Cache-Control: must-revalidate', 'Pragma: public', 'Content-Length: ' . filesize($_FILES['file']['tmp_name']) ]; // curl配置请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
- 修复fileContent字段取值错误
你当前为fileContent赋值的是上传文件的临时存储路径字符串,API端保存的是纯文本路径而非文件二进制内容,自然无法正常打开。需要通过file_get_contents()读取临时文件的实际二进制内容赋值:
$application['file'] = [ 'fileName' => $_FILES['file']['name'], 'mimeType' => $mime, 'fileContent' => base64_encode(file_get_contents($_FILES['file']['tmp_name'])), ];
注意:如果API要求传输原始二进制内容则去掉base64_encode,如果要求base64编码的文件内容则保留,可根据API文档调整。如果上传文件体积较大,建议改用流式传输避免内存溢出。
修复代码语法错误
你构造数组的原代码中'fileName' => $_FILES['file']['name'];,末尾多了多余的分号,会导致PHP语法解析错误,删除该分号即可。可选:适配标准multipart表单上传接口
如果你的API要求标准multipart/form-data格式的文件上传,无需手动拼接文件内容数组,直接使用CURLFile对象传输即可,示例如下:
$ch = curl_init($apiUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile( $_FILES['file']['tmp_name'], $mime, $_FILES['file']['name'] ) ]); $response = curl_exec($ch); curl_close($ch);
内容的提问来源于stack exchange,提问作者Peter Ayello Wright
相关产品推荐
相关产品推荐

