Не удается загрузить файл

У меня проблемы с загрузкой с сервера. Если я войду в http://mypage.com не могу скачать некоторые .zip файлы. Но если я вхожу в IP-адрес страницы, я загружаю файлы.

Другая похожая проблема, с которой я сталкиваюсь, связана с Godaddy, я не могу загружать почтовые индексы, даже если у меня есть доступ с IP или доменом.

Это часть кода для генерации XML и ZIP его:

**xmlzip.php**
$xmlfile = $rfc.$year.$month.'BN.xml';
$xml->formatOutput = true;
$el_xml = $xml->saveXML();
$xml->save($xmlfile);

$filename = $rfc.$year.$month.'BN';
shell_exec('zip ../'.$filename.' '.$xmlfile);

try {
$date= date('Ymd_Hi');
$data = '{
"filename":"xml'.$date.'.zip",
"filename2":"'.$filename.'.zip"}';
echo '{"success":1,"message":"ok","data":['.$data.']}';
} catch (Exception $e) {
$data = '';
echo '{"error":1,"message":"error","data":['.$data.']}';
die();
}

Затем я получаю это на ExtJS для создания Messagebox.wait:

**downloadzip button**
msg = Ext.MessageBox.wait('Generating XML ...', '');
Ext.Ajax.request({
url: 'cakephp/app/webroot/xml.php?',
params:{
rfc: rfc,
month: month,
year: year
},
method : "POST",
headers: {
'Content-Type': 'application/json'
},
jsonData: true,
timeout: 1000000,
withCredentials: true,
success : function(response) {
var jsonResponse = JSON.parse(response.responseText);
filename = jsonResponse.data[0].filename;
filename2 = jsonResponse.data[0].filename2;

if(jsonResponse.success === 1) {
msg.hide();
Ext.getCmp("winFormXML_XMLpanel").setHtml(
'<iframe id="" name=""'+
' src="cakephp/app/webroot/download_xml.php?filename='+
filename+'&filename2='+filename2+'" width="100%" height="100%"></iframe>');
Ext.getCmp('winFormXML').destroy();
} else {
msg.hide();
Ext.Msg.alert("ERROR","Error generating XML.");
}

},
failure : function(response) {
msg.hide();
var respObj = Ext.JSON.decode(response.responseText);
console.log(respObj);
Ext.Msg.alert("ERROR", respObj.status.statusMessage);
}
});

И с этим я скачать сгенерированный файл:

**downloadzip.php**
try {
$filename = $_REQUEST['filename'];
$filename2 = $_REQUEST['filename2'];

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$filename2);
header('Content-Length: ' . filesize($filename2));
readfile($filename2);
} catch(Exception $ex) {
echo $ex-getMessage();
}

Как я уже упоминал выше, я знаю, что это работает, потому что я могу скачать его с других компьютеров, но по IP, а не из домена.


РЕДАКТИРОВАТЬ:

Кажется, что линия Ext.getCmp('winFormXML').destroy(); давал неприятности при генерации. Удаление этой строки заставляет ее работать!

0

Решение

«Обновление нестабильным-запросов: 1«означает, что ваш браузер просит ваш сервер преобразовать URL-адрес (http) в защищенный URL-адрес (https).

И для лучшего пути для вашей логики, создайте небольшой плагин CakePH (возможно, плагин существовать) или просто используйте контроллер (например, pagesController или выделенный) и создайте внутри этого контроллера действие (функцию), которое будет выполнять всю необходимую работу (действие над файлом XML, zip и загрузкой)

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

И я не уверен, что использование shell_exec — хорошая практика, вместо этого попробуйте ZipArchive
Пример полезного cakephp почтовый помощник
или как это

<?php

...

$filename2 = 'xml.zip';

$zip = new ZipArchive;

if ($zip->open($filename2, ZipArchive::CREATE)!==TRUE)
{
die("zip creation failed!");
} else {
$zip->addFile($xmlfile);
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$filename2);
header('Content-Length: ' . filesize($filename2));
readfile($filename2);
unlink($filename2);
}
?>

И, наконец, к вашей проблеме, если у вас не было сообщения Upgrade-Insecure-Requests при использовании IP-адреса, это означает, что проблема возникла из вашего браузера. Попробуйте использовать браузер, который не поддерживает этот уровень безопасности (например, Chrome или Firefox), или просто настройте свой веб-сайт для работы по протоколу https:
-> перенаправление в вашем .htaccess (внутри вашего корневого каталога cakephp)

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteCond %{REQUEST_URI} !^/(s|g)etcmd?(.+)$
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]

RewriteCond %{QUERY_STRING} ^(.*)http(\:|\%3A)(.*)$
ReWriteRule .* - [F]

RewriteRule    ^$    webroot/    [L]
RewriteRule    (.*) webroot/$1    [L]
</IfModule>

-> и некоторая конфигурация на вашем виртуальном хосте для прослушивания через порт 443 (внутри / etc / apache2 / site-available, если вы используете * nix)

# with the automatic HTTPS redirection you are not supposed to configure HTTP part (port 80)
<VirtualHost *:80>
ServerAdmin admin@mypage.com
ServerName mypage.com
ServerAlias mypage.com
DocumentRoot /var/www/mypage
<Directory /var/www/mypage/>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Order Allow,Deny
Allow from All
</Directory>
ServerSignature Off
ErrorLog /var/log/apache2/error.log
</VirtualHost>
<VirtualHost *:443>
ServerAdmin admin@mypage.com
ServerName mypage.com
ServerAlias mypage.com
DocumentRoot /var/www/mypage
<Directory /var/www/mypage/>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Order Allow,Deny
Allow from All
</Directory>
ServerSignature Off

SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

# If you have secure certificate
SSLCertificateFile /etc/apache2/certificats/YOURCRTFILE.crt
SSLCertificateKeyFile /etc/apache2/certificats/YOURPEMFILE.pem
SSLCertificateChainFile /etc/apache2/certificats/YOURPEMFILE.pem
SSLCACertificatePath /etc/ssl/certs/
SSLCACertificateFile /etc/apache2/certificats/YOURCRTFILE.crt
ErrorLog /var/log/apache2/error.log
</VirtualHost>

Надеюсь, поможет

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector