1. 라라벨
$asciiFallback = preg_replace('/[^\x20-\x7E]/', '_', $attachment->name);
$asciiFallback = str_replace(['%', '/', '\\', '"'], '_', $asciiFallback);
$headers += [
'Content-Type'=>$attachment->type,
'Content-Transfer-Encoding'=>'binary',
// 'Content-Disposition' => 'attachment; filename="'.$attachment->name.'"',
// 'Content-Disposition' => 'inline; filename="'.$attachment->name.'"',
'Content-Disposition' => HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_INLINE,
$attachment->name,
$asciiFallback
),
];
2. 수동으로 구현
$encoded = rawurlencode($attachment->name);
$fallback = preg_replace('/[^\x20-\x7E]/', '_', $attachment->name);
$fallback = str_replace(['"', '\\'], '_', $fallback);
$headers += [
'Content-Type'=>$attachment->type,
'Content-Transfer-Encoding'=>'binary',
'Content-Disposition' => "inline; filename=\"{$fallback}\"; filename*=UTF-8''{$encoded}",
];
3. 가장 심플
'Content-Disposition' => "inline; filename*=UTF-8''".rawurlencode($attachment->name),
설명
filename= 보다 filename*= 가 우선이며,
IE8 이 아니라면 filename*= 만 있어도 문제 없다.
filename= 은 ASCII 문자만 사용할 수 있다는 문제가 있기 때문에 생기는 이슈