跨服务器文件在线编辑:如何将编辑后的tmpfile()传回PHP脚本?
解决跨服务器文件编辑中临时文件复用的问题
首先得明确一个核心点:PHP的tmpfile()返回的资源句柄是当前请求进程独有的,它没法通过HTTP请求传递给前端再传回——因为HTTP只能传输字符串、二进制这类序列化的数据,而资源句柄是内存里的标识,跨请求(甚至跨进程)完全无效,你强制转换(resource)$_POST['temp']得到的只是一个无效的空资源,根本不是原来的临时文件。
针对你的场景,有两种靠谱的解决方案:
方案1:用实际临时文件路径替代tmpfile()
tmpfile()创建的文件是匿名的,请求结束就自动销毁,没法跨请求复用。换成tempnam()创建一个有实际路径的临时文件,这样你可以把文件路径存在会话里或者传给前端,编辑完成后通过路径找回文件。
具体步骤:
- 下载文件到带路径的临时文件
// 1. 下载目标服务器的文件内容 $remoteContent = file_get_contents('http://your-target-server/path/to/file'); // 2. 在系统临时目录创建一个带前缀的临时文件,得到实际路径 $tempFilePath = tempnam(sys_get_temp_dir(), 'cross_edit_'); // 3. 把下载的内容写入这个临时文件 file_put_contents($tempFilePath, $remoteContent); // 4. 把临时路径存到Session(推荐,比传给前端更安全) session_start(); $_SESSION['edit_temp_file'] = $tempFilePath; // 或者把路径通过隐藏域传给前端表单,注意要转义防止XSS // echo '<input type="hidden" name="temp_path" value="' . htmlspecialchars($tempFilePath) . '">';
- 编辑完成后,通过路径找回文件并处理
session_start(); // 从Session或POST获取临时文件路径 $tempFilePath = $_POST['temp_path'] ?? $_SESSION['edit_temp_file']; $editedContent = $_POST['edited_content']; // 把编辑后的内容写入临时文件 file_put_contents($tempFilePath, $editedContent); // 5. 上传修改后的文件回目标服务器(这里用curl示例) $ch = curl_init('http://your-target-server/upload-endpoint'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, [ 'updated_file' => new CURLFile($tempFilePath) ]); curl_exec($ch); curl_close($ch); // 6. 清理临时文件和Session unlink($tempFilePath); unset($_SESSION['edit_temp_file']);
方案2:直接传输文件内容(不用保留临时文件)
如果不需要保留临时文件的物理副本,可以直接把下载的文件内容传给前端编辑器,编辑完成后POST回内容,再直接上传到目标服务器,完全绕开临时文件跨请求的问题。
示例代码:
- 下载并把内容传给编辑器
$remoteContent = file_get_contents('http://your-target-server/path/to/file'); // 把内容输出到编辑器(比如textarea) echo '<textarea name="edited_content">' . htmlspecialchars($remoteContent) . '</textarea>';
- 接收编辑后的内容并上传
$editedContent = $_POST['edited_content']; // 直接把内容上传到目标服务器 $ch = curl_init('http://your-target-server/upload-endpoint'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, [ 'content' => $editedContent, 'filename' => 'your-file-name.txt' ]); curl_exec($ch); curl_close($ch);
注意事项
- 安全问题:如果把临时文件路径传给前端,一定要做严格的校验(比如检查路径是否在系统临时目录内),防止用户篡改路径访问服务器上的其他文件;用Session存储路径更安全。
- 清理机制:不管用哪种方案,处理完后一定要删除临时文件,避免磁盘空间被占用。
内容的提问来源于stack exchange,提问作者Finduson
相关产品推荐
相关产品推荐

