У меня есть файл php, который берет zip-файл и распаковывает его, а затем помещает его по желаемому пути на моем сервере.Загрузка Zip-файла на сервер с AJAX
Он отлично работает с типичной формой, которая вызывает файл php в действии. Я пытаюсь сделать эту работу с AJAX, но я пробовал каждый фрагмент кода, который я могу найти без всякой удачи.
Есть что-то здесь, мне не хватает? Неужели это можно сделать?
Формы для загрузки файла почтового индекса,
<div id="response"></div>
<form enctype="multipart/form-data" method="post" action="">
<label>Choose a zip file to upload: <input type="file" name="zip_file" id="zip_file" /></label>
<br />
<input type="submit" name="submit" value="Upload" onClick="uploadZip()" />
</form>
Текущего JS - Я не получаю ошибок, страница фактически перезагружает с моим текущим сценарием ..
<script>
function uploadZip() {
formdata = new FormData();
if (formdata) {
$('.main-content').html('<img src="LoaderIcon.gif" />');
$.ajax({
url: "assets/upload-plugin.php",
type: "POST",
data: formdata,
processData: false,
contentType: false,
success: function (res){
document.getElementById("response").innerHTML = res;
}
});
}
}
</script>
PHP скрипт, который обрабатывает загрузки молнии и разархивировать его, прежде чем размещать его на сервере.
function rmdir_recursive($dir) {
foreach(scandir($dir) as $file) {
if ('.' === $file || '..' === $file) continue;
if (is_dir("$dir/$file")) rmdir_recursive("$dir/$file");
else unlink("$dir/$file");
}
rmdir($dir);
}
if($_FILES["zip_file"]["name"]) {
$filename = $_FILES["zip_file"]["name"];
$source = $_FILES["zip_file"]["tmp_name"];
$type = $_FILES["zip_file"]["type"];
$name = explode(".", $filename);
$accepted_types = array('application/zip', 'application/x-zip-compressed', 'multipart/x-zip', 'application/x-compressed');
foreach($accepted_types as $mime_type) {
if($mime_type == $type) {
$okay = true;
break;
}
}
$continue = strtolower($name[1]) == 'zip' ? true : false;
if(!$continue) {
$message = "The file you are trying to upload is not a .zip file. Please try again.";
}
/* PHP current path */
$path = '../plugins/'; // absolute path to the directory where zipper.php is in
$filenoext = basename ($filename, '.zip'); // absolute path to the directory where zipper.php is in (lowercase)
$filenoext = basename ($filenoext, '.ZIP'); // absolute path to the directory where zipper.php is in (when uppercase)
$targetdir = $path . $filenoext; // target directory
$targetzip = $path . $filename; // target zip file
/* create directory if not exists', otherwise overwrite */
/* target directory is same as filename without extension */
if (is_dir($targetdir)) rmdir_recursive ($targetdir);
mkdir($targetdir, 0777);
/* here it is really happening */
if(move_uploaded_file($source, $targetzip)) {
$zip = new ZipArchive();
$x = $zip->open($targetzip); // open the zip file to extract
if ($x === true) {
$zip->extractTo($targetdir); // place in the directory with same name
$zip->close();
unlink($targetzip);
}
$message = "Your .zip file was uploaded and unpacked.";
} else {
$message = "There was a problem with the upload. Please try again.";
}
}
Эта функция php отлично работает до тех пор, пока я делаю это с помощью действия формы. Поэтому я уверен, что моя проблема существует в функции AJAX.
Спасибо за любую помощь, которую вы можете предоставить.
Вау спасибо тонну. Это сработало. Хотя я немного смущен. Я попытался поменять каждый блок кода, как вы объяснили, но вы заменили этот formdata = new FormData (документ.формы [0]); затем сделал это снова с функцией uploadZip. Вы имели в виду добавить дополнительную декларацию formdata вне функции? – wuno
Я предполагаю, что вы просто давали мне указатели, чем после того, как мы показываем пример. Если я ошибаюсь, дайте мне знать. Еще раз спасибо. – wuno
@wuno - №. Первым примером было быстрое и грязное исправление. Тогда было горизонтальное правило, комментарий, который вы могли бы сделать все в чистом виде, а затем лучше подойти. – Quentin