如何在PHP上传前修改AWS S3存储桶的文件Content-Type
解决AWS S3上传图片触发下载及Content-Type不生效问题
核心问题分析与修改方案
修正SourceFile参数错误
你当前代码中SourceFile使用了$keyName(S3存储键名),而非本地上传文件的临时路径,这会导致上传内容异常,直接引发Content-Type设置失效。需替换为$_FILES["fileToUpload"]['tmp_name']。动态匹配真实MIME类型
硬写image/png无法适配JPG等其他图片格式,建议用PHP的finfo扩展自动检测文件的真实MIME类型,确保Content-Type与文件格式一致。强制浏览器直接展示
添加ContentDisposition参数并设置为inline,明确告知浏览器直接渲染图片,而非触发下载行为。
修正后的完整代码
// 获取上传文件的临时路径与原始文件名 $tmpFilePath = $_FILES["fileToUpload"]['tmp_name']; $originalFileName = basename($_FILES["fileToUpload"]['name']); $keyName = 'test_example/' . $originalFileName; // 用原始文件名作为S3键,避免临时文件名混乱 $pathInS3 = 'https://s3.eu-west-2.amazonaws.com/' . $bucketName . '/' . $keyName; // 自动检测文件的MIME类型 $finfo = new finfo(FILEINFO_MIME_TYPE); $contentType = $finfo->file($tmpFilePath); // 上传至S3 try { $s3->putObject( array( 'Bucket' => $bucketName, 'Key' => $keyName, 'ContentType' => $contentType, 'SourceFile' => $tmpFilePath, 'StorageClass' => 'REDUCED_REDUNDANCY', 'ContentDisposition' => 'inline' ) ); } catch (S3Exception $e) { die('Error:' . $e->getMessage()); } catch (Exception $e) { die('Error:' . $e->getMessage()); }
内容的提问来源于stack exchange,提问作者Sprite
相关产品推荐
相关产品推荐

