Non è tanto la dimensione del file, ma il numero di file troppo alto che manda in timeout lo script durante l'estrazione di drupal; ho provato anche a fare la versione con javascript:
Codice PHP:
<?php
if(isset($_POST['action']))
{
switch ($_POST['action'])
{
case 'import':
import_file();
done('File importato correttamente.');
break;
case 'extract':
extract_file();
done('File estratto correttamente');
break;
case 'delete':
delete_file();
break;
default:
error('comando non conosciuto');
}
}
function error($str)
{
header('Content-Type: application/json');
echo json_encode(array('message'=>$str,'error'=>1));
exit();
}
function done($str)
{
header('Content-Type: application/json');
echo json_encode(array('message'=>$str,'error'=>0));
exit();
}
function checkUrl($url = false)
{
if($url === false)
{
if(isset($_POST['url']))
$url = $_POST['url'];
else
error('URL inesistente!');
}
if(empty($url))
error('url vuota ('.$url.') - ('.$_POST['url'].')'.'['.$_POST['action'].']');
if (($url = filter_var($url, FILTER_VALIDATE_URL)) === FALSE)
error('url non ben definita');
else
return $url;
return false;
}
function import_file()
{
$url_post = checkUrl();
$localZip = basename(parse_url($url_post, PHP_URL_PATH));
if (!copy($url_post, $localZip))
error('Errore durante la copia del file nello spazio');
}
function extract_file()
{
$localZip = checkUrl();
$localZip = basename(parse_url($localZip, PHP_URL_PATH));
$directory = $_POST['directory']; //check?
$zip = new ZipArchive();
if ($zip->open($directory.$localZip)!== TRUE)
{
error('Errore durante apertura file zip');
}
if($zip->extractTo($directory) !== TRUE)
{
error('Errore durante estrazione zip');
}
$zip->close();
}
function delete_file()
{
$localZip = checkUrl();
$localZip = basename(parse_url($localZip, PHP_URL_PATH));
$directory = $_POST['directory']; //check?
if(unlink($directory.$localZip) == FALSE)
error('Errore durante cancellazione file zip');
else
done('File '.$directory.$localZip.' eliminato correttamente');
}
?><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title> Carica file da URL </title>
<style>
#loader {
display:none;
border-radius: 50%;
border-top: 3px solid blue;
width: 10px;
height: 10px;
-webkit-animation: spin 2s linear infinite;
animation: spin 2s linear infinite;
float:left;
}
@-webkit-keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
#current_op
{
margin-left:10px;
}
p{ margin:0px;}
</style>
<script>
var states = [
['import','Importazione file'],
['extract', 'Estrazione file'],
['delete', 'Cancellazione file']
];
var state = 0;
function request()
{
var f_url = document.getElementById('url').value;
var f_directory = document.getElementById('directory').value;
var f_delete = document.getElementById('delete').checked;
document.getElementById('loader').style.display = 'inline';
document.getElementById('current_op').innerHTML = states[state][1];
/**/
fetch('<?= $_SERVER['PHP_SELF']; ?>', {
method: 'post',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: 'action='+states[state][0]+'&directory='+f_directory+'&url='+f_url
}).then(
function(response) {
var contentType = response.headers.get("content-type");
if(contentType && contentType.includes("application/json")) {
return response.json();
}
throw new TypeError("JSON non corretto!");
return false;
}
).then(
function (data)
{
feedback(data['message'],data['error']);
document.getElementById('loader').style.display = 'none';
document.getElementById('current_op').innerHTML = '';
if(data['error'] == 0)
switch (state)
{
case 0:
state = 1;
request();
break;
case 1:
if(f_delete)
{
state = 2;
request();
}
break;
}
}
).catch(function(error) {
feedback('Problemi con la comunicazione server',1);
document.getElementById('loader').style.display = 'none';
return false;
});
/**/
}
function feedback(text,error)
{
var feed = document.getElementById('feed');
if(error)
status = '✘';
else
status = '✔';
feed.innerHTML = '<p>'+status+' '+text+'</p>'+feed.innerHTML;
}
function reset_feedback()
{
document.getElementById('feed').innerHTML = '';
}
window.onload = function(){
document.getElementById('form_import').addEventListener('submit', function(evt){
evt.preventDefault();
reset_feedback();
state = 0;
request();
});
}
</script>
</head>
<body>
<div id="loader"></div> <span id="current_op"></span>
<div id="feed"></div>
<form id="form_import" method="POST">
<label for="url">File da importare: </label><input type="text" name="url" id="url"><br>
<label for="directory">Cartella: </label><input type="text" name="directory" id="directory" value="./"><br>
<label for="delete">Elimina zip </label><input type="checkbox" name="delete" id="delete">
<input type="submit" value="importa">
</form>
</body>
</html>
Ma niente da fare, si vede che termina nell'estrazione.
Per altri CMS (come wordpress) funziona.
Ciao!