Интерфейс Javascript не загружает вложения IMAP через PHPPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Интерфейс Javascript не загружает вложения IMAP через PHP

Сообщение Anonymous »

У меня есть веб-страница на PHP, которая позволяет мне получить доступ к учетной записи IMAP. Я могу получать сообщения нормально. Но когда я перехожу к загрузке вложений, Firefox открывает диалог загрузки, но сразу после этого выскакивает окно с сообщением: «W227LcEc.png.part не может быть сохранен, поскольку исходный файл не может быть прочитан». И он не позволяет мне нажать кнопку «Сохранить» в диалоговом окне загрузки.
Однако я проверил вкладку «Сеть» в инструментах разработчика. Файл был получен правильно (код возврата 200), размер соответствует ожидаемому, и на вкладке «Ответ» я вижу содержимое файла, закодированное в Base64. Если я возьму этот контент и сохраню его в текстовый файл, декодирую Base64, у меня будет отлично работающий файл.
Я погуглил, нашел советы по поводу директив заголовков, но безуспешно для решения проблемы.
Я включаю только соответствующую часть кодов.
Это HTML:

Код: Выделить всё

clinical-guidelines-2024-en.pdf
В этом примере «1234» будет уникальным идентификатором конкретного электронного письма, а «ABCEDF» — уникальным идентификатором его вложения (в данном примере — упомянутого PDF-файла).
Теперь код JavaScript:

Код: Выделить всё

function download(message_id,attachment_id) {
var link_el = document.createElement("A");
link_el.href = 'https://my.server.com/webservice.php?message_id='+message_id+'&attachment_id='+attachment_id;
link_el.click();
}
А это соответствующая часть PHP-кода в webservice.php:

Код: Выделить всё

$struct = imap_fetchstructure($imap_instance,$message_id,FT_UID);
...
// Then I process $struct, loop through $struct->parts, until I find the correct attachment
...
// When attachment is found:
$type = $struct->parts[$i]->type;
$subtype = strtolower($struct->parts[$i]->subtype);
$filesize = $struct->parts[$i]->bytes;
$encoding = $struct->parts[$i]->encoding;
$attachment_partno = $i + 1;
$data = imap_fetchbody($imap_instance,$message_id,$attachment_partno,FT_UID | FT_PEEK);
if ($encoding == 4) {
$data = quoted_printable_decode($data);
} elseif ($encoding == 3) {
$data = base64_decode($data);
}
$mimetypes = array(0 => 'text',1 => 'multipart',2 => 'message',3 => 'application',4 => 'audio',5 => 'image',6 => 'video',7 => 'model',8 => 'other');
header('Content-Type: '.$mimetypes[$type].'/'.$subtype);
// Force the browser to download the file as an attachment
// The $filename variable is processed from the PARAMETERS and DPARAMETERS values, and decoded with imap_mime_header_decode(). I'm omitting all this for brevity, since this part is working all right.
header('Content-Disposition: attachment; filename="'.$filename.'"');
// Specify the file size for download progress indicators
header('Content-Length: '.$filesize);
// Prevent caching of the file
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Expires: 0');
echo $data;
При переходе по ссылке запрос к серверу сделан правильно, и ответ тоже правильный. Вот заголовки ответов:

Код: Выделить всё

HTTP/2 200
date: Tue, 18 Nov 2025 15:07:57 GMT
content-type: application/pdf
content-length: 408416
access-control-allow-origin: UNSET
content-disposition: attachment; filename="clinical-guidelines-2024-en.pdf"
cache-control: must-revalidate, post-check=0, pre-check=0
pragma: public
expires: 0
strict-transport-security: max-age=63072000; includeSubDomains; preload
permissions-policy: accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), encrypted-media=(), fullscreen=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=(), aria-notify=(), captured-surface-control=(), cross-origin-isolated=(), deferred-fetch=(), deferred-fetch-minimal=(), on-device-speech-recognition=(), summarizer=(), wildcards=(), interest-cohort=()
x-dns-prefetch-control: off
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
x-frame-options: SAMEORIGIN
content-security-policy: object-src 'none'; form-action 'self'; frame-ancestors 'self';
X-Firefox-Spdy: h2
Моя платформа — Windows 10, и я использую 64-разрядную версию Firefox 144.0.
Любая помощь приветствуется!

Подробнее здесь: https://stackoverflow.com/questions/798 ... hrough-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»