Как извлечь папку из zip файла при загрузке с помощью html и javascript и django
Я работаю над приложением django, в котором html код под названием tool.hmtl
вместе с javascript кодом под названием myscripts.js
позволяют пользователю загружать папку и затем выполнять некоторую обработку этих данных. Соответствующий раздел tool.hmtl
приведен ниже.
<main class="tool mg-t-900">
<div id="folderUploadDiv">
<h1 class="tool__heading | text-center text-capitalize">
Upload your folder here
</h1>
<label
for="folder"
class="tool__upload | flex flex-center flex-column mg-t-500 text-center"
>
<i class="ri-upload-cloud-line tool__icon"></i>
<p class="tool__txt text-capitalize">Browse folder to upload</p>
</label>
<input type="file" id="folder" webkitdirectory multiple />
.............some code......
<script src="{% static 'myscripts.js' %}"></script>
<script src="{% static 'app.js' %}"></script>
<script>
const fileInput = document.querySelector("#folder");
const loder = document.querySelector(".loder");
const toggleLoder = function () {
loder.classList.add("active");
setTimeout(() => {
loder.classList.remove("active");
}, 30000);
startTypingAnimation();
};
fileInput.addEventListener("change", toggleLoder);
function startTypingAnimation() {
new TypeIt("#loder-text", {
strings: "Your file is being prepared...",
speed: 75,
loop: true,
}).go();
}
</script>
<script>
setTimeout(function () {
location.reload();
}, 300000); // refresh every 5 minutes (300000 milliseconds)
</script>
</body>
</html>
{% endblock %}
и соответствующий раздел myscripts.js
выглядит следующим образом.
// const axios = require('axios');
$("#folderUploadDiv").show();
$("#selectorDiv").hide();
username = "";
contentType = "";
var dataToSend = []
var flag=1
document.getElementById("folder").addEventListener("change", function(event) {
var output = document.querySelector("ul");
var files = event.target.files;
var jsonFiles =0;
var rightOrderFiles = [];
for (var i=0; i<files.length; i++) {
var item = document.createElement("li");
var innerFiles = files[i].webkitRelativePath.split("/");
if(innerFiles.length ===4){
jsonFiles++;
rightOrderFiles.push(files[i].webkitRelativePath)
var reader = new FileReader();
reader.onload = onReaderLoad;
reader.readAsText(files[i]);
}
// console.log("file path : ", files[i].webkitRelativePath);
item.innerHTML = files[i].webkitRelativePath;
output.appendChild(item);
};
}, false);
В этом фрагменте кода (как HTML, так и Javascript) мы видим, что пользователь загружает папку, а затем некоторая обработка выполняется в Javascript.
Мой вопрос в том, как я могу изменить код в tool.hmtl
вместе с кодом javascript myscripts.js
таким образом, чтобы пользователь загружал zip файл и папка извлекалась из этого zip файла, а не пользователь загружал саму папку. Все остальное остается неизменным, единственное изменение, которое необходимо, это позволить пользователю загружать zip файл вместо папки напрямую, а папка затем извлекается из zip файла.
В HTML файле tool.html необходимо изменить тип ввода с file на file[] и принимать только zip файлы. Замените эту строку:
<input type="file" id="folder" accept=".zip" multiple />
В JavaScript-файле myscripts.js необходимо извлечь загруженный zip-файл с помощью библиотеки JavaScript, например jszip, и прочитать файлы внутри zip-файла. Сначала необходимо включить библиотеку jszip в ваш проект, например:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.5.0/jszip.min.js"></script>
Затем, некоторые изменения в коде
document.getElementById("folder").addEventListener("change", function(event) {
var output = document.querySelector("ul");
var files = event.target.files;
var jsonFiles = 0;
var rightOrderFiles = [];
for (var i = 0; i < files.length; i++) {
JSZip.loadAsync(files[i])
.then(function(zip) {
var zipFiles = zip.files;
Object.keys(zipFiles).forEach(function(filename) {
var item = document.createElement("li");
var innerFiles = filename.split("/");
if (innerFiles.length === 4) {
jsonFiles++;
rightOrderFiles.push(filename);
zip.files[filename].async("text").then(function(fileData) {
var reader = new FileReader();
reader.onload = onReaderLoad;
reader.readAsText(new Blob([fileData]));
});
}
item.innerHTML = filename;
output.appendChild(item);
});
})
.catch(function(error) {
console.error("Error in extracting zip file:", error);
});
}
});
Чтобы изменить код для извлечения папки из zip-файла, необходимо внести следующие изменения в tool.html и myscripts.js:
1- В файле tool.html измените тип ввода файла на "файл" вместо "папка".
<input type="file" id="folder" />
2- В файле myscripts.js используйте библиотеку, например jszip.js, для извлечения содержимого загруженного zip-файла. Вы можете добавить библиотеку в свой проект, включив следующую строку в шапку tool.html:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.2.2/jszip.min.js"></script>
3- Замените слушатель события для ввода файла следующим кодом:
document.getElementById("folder").addEventListener("change", function(event) {
var output = document.querySelector("ul");
var file = event.target.files[0];
var reader = new FileReader();
reader.onload = function (e) {
var zip = new JSZip();
zip.loadAsync(e.target.result)
.then(function (zip) {
var rightOrderFiles = [];
var jsonFiles = 0;
zip.forEach(function (relativePath, file) {
if (relativePath.split("/").length === 4) {
jsonFiles++;
rightOrderFiles.push(relativePath);
file.async("text").then(function (content) {
var item = document.createElement("li");
item.innerHTML = relativePath;
output.appendChild(item);
});
}
});
});
};
reader.readAsArrayBuffer(file);
}, false);
Этот код использует JSZip для загрузки содержимого загруженного zip-файла, извлечения файлов и их обработки таким же образом, как и раньше.