PHP如何避免重复上传?裁剪压缩后仅FTP上传本地不存储
解决裁剪压缩后仅上传FTP不保留本地文件的问题
你现在的核心问题是crop_compress会把处理后的图片写入本地文件,之后ftp_put又上传这个文件,导致本地和FTP各存一份。要避免本地留存,我们可以跳过本地文件的持久化存储,要么直接从内存上传处理后的图片数据,要么用系统临时文件上传后立即清理。
方法一:直接从内存上传(推荐)
这种方法修改crop_compress函数,让它返回处理后的图片二进制数据,而不是写入本地文件,接着用ftp_fput直接从内存流完成上传:
修改后的crop_compress函数
function crop_compress($source_url, $qual) { $image = imagecreatefromjpeg($source_url); $width = imagesx($image); $height = imagesy($image); $thumb_width = $width; $thumb_height = (9/16)*$width; // 保留你原本的裁剪逻辑(比如imagecopyresampled等代码) // ... $thumb = imagecreatetruecolor($thumb_width, $thumb_height); // 开启输出缓冲,捕获imagejpeg的输出内容 ob_start(); // 不指定目标文件,直接把图片内容输出到缓冲 imagejpeg($thumb, null, $qual); // 获取缓冲中的图片二进制数据 $image_data = ob_get_clean(); // 释放图像资源,避免内存泄漏 imagedestroy($image); imagedestroy($thumb); return $image_data; }
调用函数并上传到FTP
// 获取处理后的图片二进制数据 $processed_image = crop_compress($_FILES["fileToUpload"]["tmp_name"][$key], 90); // 创建内存临时文件句柄 $temp_handle = fopen('php://temp', 'r+'); // 将图片数据写入临时句柄 fwrite($temp_handle, $processed_image); // 将文件指针移到开头,确保ftp_fput能读取完整内容 rewind($temp_handle); // 上传到FTP服务器($target_file是你要在FTP上保存的路径) if (ftp_fput($connecti, $target_file, $temp_handle, FTP_BINARY)) { echo "图片成功上传到FTP!"; } else { echo "FTP上传失败"; } // 关闭临时句柄 fclose($temp_handle);
方法二:使用系统临时文件(无需大幅修改原函数)
如果你不想改动crop_compress的核心逻辑,可以让它写入系统临时目录的文件,上传完成后立即删除这个临时文件:
// 创建系统临时文件(自动生成唯一文件名,存在系统临时目录) $temp_file = tempnam(sys_get_temp_dir(), 'upload_'); // 调用原crop_compress函数,写入临时文件 $filename = crop_compress($_FILES["fileToUpload"]["tmp_name"][$key], $temp_file, 90); // 上传到FTP if (ftp_put($connecti, $target_file, $temp_file, FTP_BINARY)) { echo "上传成功"; // 上传完成后删除临时文件,避免垃圾堆积 unlink($temp_file); } else { echo "上传失败"; // 即使失败也建议删除临时文件 unlink($temp_file); }
关于执行顺序的说明
原代码的执行顺序是没问题的:先完成crop_compress的裁剪压缩并生成文件,再执行ftp_put上传。问题出在crop_compress会在本地留存文件,我们通过内存处理或临时文件自动清理的方式,解决了本地文件残留的问题。
内容的提问来源于stack exchange,提问作者hameds1
相关产品推荐
相关产品推荐

