You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:34:41