загрузка файла изображения php по коду - PullRequest
2 голосов
/ 25 апреля 2011

Это касается загрузки файлов с помощью PHP

Моя версия php 5.3.5 и мой apache 2.2.17

Я пытаюсь загрузить файлы (pdf, jpg, tiff), которые язагрузили на мой сервер, и они загружаются с тем же размером и типом, но я не могу их видеть.Я предполагаю, что они не скопированы правильно.Но когда я открываю оригинальные загруженные, они работают просто отлично.Я видел почти все вопросы, которые появлялись как предложено, и ни один из них не ответил на вопрос, т. Е. Только похожий - это , но все еще не отвечает на мой вопрос.

для загрузки я используюэтот код

       header("Content-type: application/force-download"); 
       header('Content-Disposition: inline; filename="' . $dir . '"'); 
       header("Content-Transfer-Encoding: Binary"); 
       header("Cache-Control: no-store, no-cache, must-revalidate");  
       header("Cache-Control: post-check=0, pre-check=0", false);  
       header("Pragma: no-cache"); 
       header("Content-length: ".filesize($dir)); 
       header('Content-Type: application/octet-stream'); 
       header('Content-Disposition: attachment; filename="' . $file . '"'); 
       readfile("$dir"); 

где $dir="62756d616769636e63/646973736572746174/ehddggh/1.JPG" и $file="1.JPG"

Может кто-нибудь подсказать мне, что я делаю неправильно, или дать мне лучшее решение для загрузки файлов?

Ответы [ 5 ]

3 голосов
/ 25 апреля 2011

Это пахнет, как будто вы получаете дополнительный (поддельный) контент в загруженных файлах.

Убедитесь, что у вас нет заголовков, пробелов или чего-то еще, прежде чем ваши открытые теги PHP в ваших файлах;также, что у вас нет завершающих пробелов или каких-либо других данных после закрывающих тегов PHP (если вы закрываете свои теги PHP).

Кроме того, немного очистите свой код: почему несколько Content-Type заголовков?Почему несколько Content-Disposition заголовков?

1 голос
/ 24 июня 2013

Оплата вперед по двухлетнему вопросу ...

У меня была похожая проблема с поврежденными загрузками, которые не могли быть открыты (когда щелчок правой кнопкой мыши и сохранение как работали отлично).Прочитав ответ @ Jon's , я понял, что он что-то задумал.Если вы посмотрите документы для readfile (ссылка ниже), вы увидите ob_clean (), flush () и выход в их примере.Все это минимизирует утечку дополнительных символьных данных в ответе.Я просто скопировал их пример № 1, и моя проблема была решена.

http://php.net/readfile

1 голос
/ 26 апреля 2011

Спасибо всем за ответы. Я вызывал загрузку как функцию в файле с другими функциями, поэтому в конце концов мне пришлось написать сценарий отдельно от других файлов. Моя проблема заключалась в том, что мне нужно, чтобы он был безопасным и загружал файл только в том случае, если он принадлежал пользователю, а пользователь вошел в систему, поэтому я отправляю все необходимые данные, зашифрованные, и внутри сценария я использую ряд вещей для посмотреть, действительно ли владелец зарегистрированный пользователь. Поэтому, если кто-то хочет знать, это код, который я использовал, и он отлично работает.

<?php
session_start();
$a=$_GET['a'];
$parts=explode("-",$a);
$tres=$parts[0];
$nombre=$partes[1];
$dbcodletra=substr($tres,2);
if($dbcod!=$_SESSION["username"])$boolt=0;
if($ext==1) $extl=".jpg";
if($ext==2) $extl=".jpeg";
if($ext==3) $extl=".tif";
if($ext==4) $extl=".tiff";
if($ext==5) $extl=".pdf";
if($ext==6) $extl=".doc";
if($ext==7) $extl=".docx";
if($tipoproy==1) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==2) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==3) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if($tipoproy==4) $dir="rute/".$dbcodletra."/".$nombre.$extl;
if (file_exists($dir) && $boolt) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($dir));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($dir));
    ob_clean();
    flush();
    readfile($dir);
    exit;
}else echo "<meta http-equiv=\"Refresh\" content=\"0;url=misdocumentos.php\">";
?>
1 голос
/ 25 апреля 2011
readfile($dir); // without the quotes?

Также убедитесь, что $ dir действительно существует

is_file($dir) или file_exists($dir)

0 голосов
/ 25 апреля 2011

Ваши заголовки выглядят беспорядочно, попробуйте сделать следующее:

header('Pragma: public');
header('Cache-Control: public, no-cache');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($dir));
header('Content-Disposition: attachment; filename="' . basename($dir) . '"');
header('Content-Transfer-Encoding: binary');

readfile($dir);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...