mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-05-28 01:17:03 +02:00
Add zip (#3075)
# Description of Changes - Made a recursive function that checks if a file is a zip, then scans its contents. If the content is a zip, or an accepted file type (non-folder, size > 0), add it and repeat the check for zips - Change all convert fragment to accept application/zip - Slightly modified the input file styling to include an ID for appending the "Extracting" text - Added language translation for the "Extracting..." text - (Edit March 3) Removed recursive function, zip file inside target zip file is excluded - For decrypt function after uploading the file, i reused one webworker to handle the decryption , since in the previous code the workers are created but not detroyed for every single file, this caused a huge slow down for uploading large files due to creation of threads and thus this proposal. - Closes #2951 --- ### General - [ ✅] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [✅ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [✅ ] I have performed a self-review of my own code - [✅ ] My changes generate no new warnings ### UI Changes (if applicable)  Added extracting text (for all language). ### Testing (if applicable) - [ ✅] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: Ludy <Ludy87@users.noreply.github.com> Co-authored-by: reecebrowne <74901996+reecebrowne@users.noreply.github.com> Co-authored-by: Reece Browne <reece@stirling.pdf> Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Co-authored-by: swanemar <107953493+swanemar@users.noreply.github.com> Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
This commit is contained in:
parent
b6b49762f6
commit
b0836d0bd7
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=قم بسحب الملفات وإفلاتها
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=قم بسحب المفات وإفلاتها هنا
|
||||
fileChooser.extractPDF=جاري الاستخراج...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Buraxılışlar
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Влачете и пуснете
|
||||
fileChooser.dragAndDropPDF=Влачете и пуснете PDF файл
|
||||
fileChooser.dragAndDropImage=Влачете и пуснете изображение
|
||||
fileChooser.hoveredDragAndDrop=Влачете и пуснете файл(ове) тук
|
||||
fileChooser.extractPDF=Извличане...
|
||||
|
||||
#release notes
|
||||
releases.footer=Версии
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Přetáhnout
|
||||
fileChooser.dragAndDropPDF=Přetáhnout PDF soubor
|
||||
fileChooser.dragAndDropImage=Přetáhnout obrázek
|
||||
fileChooser.hoveredDragAndDrop=Přetáhněte soubor(y) sem
|
||||
fileChooser.extractPDF=Extrahování...
|
||||
|
||||
#release notes
|
||||
releases.footer=Vydání
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF-Datei
|
||||
fileChooser.dragAndDropImage=Drag & Drop Bilddatei
|
||||
fileChooser.hoveredDragAndDrop=Datei(en) hierhin Ziehen & Fallenlassen
|
||||
fileChooser.extractPDF=Extrahiere...
|
||||
|
||||
#release notes
|
||||
releases.footer=Veröffentlichungen
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Σύρετε & αφήστε
|
||||
fileChooser.dragAndDropPDF=Σύρετε & αφήστε αρχείο PDF
|
||||
fileChooser.dragAndDropImage=Σύρετε & αφήστε αρχείο εικόνας
|
||||
fileChooser.hoveredDragAndDrop=Σύρετε & αφήστε αρχείο(α) εδώ
|
||||
fileChooser.extractPDF=Εξαγωγή...
|
||||
|
||||
#release notes
|
||||
releases.footer=Εκδόσεις
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Arrastrar & Soltar
|
||||
fileChooser.dragAndDropPDF=Arrastrar & Soltar archivo PDF
|
||||
fileChooser.dragAndDropImage=Arrastrar & Soltar archivo de Imagen
|
||||
fileChooser.hoveredDragAndDrop=Arrastrar & Soltar archivos(s) aquí
|
||||
fileChooser.extractPDF=Extrayendo...
|
||||
|
||||
#release notes
|
||||
releases.footer=Versiones
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=بکشید و رها کنید
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=فایل(های) خود را اینجا بکشید و رها کنید
|
||||
fileChooser.extractPDF=در حال استخراج...
|
||||
|
||||
#release notes
|
||||
releases.footer=نسخهها
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Glisser & Déposer
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Glisser & Déposer le(s) fichier(s) ici
|
||||
fileChooser.extractPDF=Extraction en cours...
|
||||
|
||||
#release notes
|
||||
releases.footer=Versions
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Tarraing & Scaoil
|
||||
fileChooser.dragAndDropPDF=Tarraing & Scaoil comhad PDF
|
||||
fileChooser.dragAndDropImage=Tarraing & Scaoil comhad Íomhá
|
||||
fileChooser.hoveredDragAndDrop=Tarraing agus scaoil comhad(í) anseo
|
||||
fileChooser.extractPDF=Ag Aistriú...
|
||||
|
||||
#release notes
|
||||
releases.footer=Eisiúintí
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=खींचें और छोड़ें
|
||||
fileChooser.dragAndDropPDF=PDF फ़ाइल खींचें और छोड़ें
|
||||
fileChooser.dragAndDropImage=छवि फ़ाइल खींचें और छोड़ें
|
||||
fileChooser.hoveredDragAndDrop=फ़ाइल(ें) यहाँ खींचें और छोड़ें
|
||||
fileChooser.extractPDF=निकालना...
|
||||
|
||||
#release notes
|
||||
releases.footer=रिलीज़
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Húzza ide
|
||||
fileChooser.dragAndDropPDF=Húzza ide a PDF fájlt
|
||||
fileChooser.dragAndDropImage=Húzza ide a képfájlt
|
||||
fileChooser.hoveredDragAndDrop=Húzza ide a fájl(oka)t
|
||||
fileChooser.extractPDF=Kinyerés...
|
||||
|
||||
#release notes
|
||||
releases.footer=Kiadási jegyzék
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Trascina & Rilascia
|
||||
fileChooser.dragAndDropPDF=Trascina & rilascia il file PDF
|
||||
fileChooser.dragAndDropImage=Trascina & rilascia il file immagine
|
||||
fileChooser.hoveredDragAndDrop=Trascina & rilascia i file qui
|
||||
fileChooser.extractPDF=Estraendo...
|
||||
|
||||
#release notes
|
||||
releases.footer=Rilasci
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=ドラッグ&ドロップ
|
||||
fileChooser.dragAndDropPDF=PDFファイルをドラッグ&ドロップ
|
||||
fileChooser.dragAndDropImage=画像ファイルをドラッグ&ドロップ
|
||||
fileChooser.hoveredDragAndDrop=ファイルをここにドラッグ&ドロップ
|
||||
fileChooser.extractPDF=抽出中...
|
||||
|
||||
#release notes
|
||||
releases.footer=リリース
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=드래그 앤 드롭
|
||||
fileChooser.dragAndDropPDF=PDF 파일을 드래그 앤 드롭
|
||||
fileChooser.dragAndDropImage=이미지 파일을 드래그 앤 드롭
|
||||
fileChooser.hoveredDragAndDrop=여기에 파일을 드래그 앤 드롭하세요
|
||||
fileChooser.extractPDF=추출 중...
|
||||
|
||||
#release notes
|
||||
releases.footer=릴리스
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Arraste & Solte
|
||||
fileChooser.dragAndDropPDF=Arraste & Solte PDF(s)
|
||||
fileChooser.dragAndDropImage=Arraste & Solte Imagem(ns)
|
||||
fileChooser.hoveredDragAndDrop=Arraste & Solte arquivo(s) aqui
|
||||
fileChooser.extractPDF=Extraindo...
|
||||
|
||||
#release notes
|
||||
releases.footer=Versões
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Arrastar e Largar
|
||||
fileChooser.dragAndDropPDF=Arrastar e Largar ficheiro PDF
|
||||
fileChooser.dragAndDropImage=Arrastar e Largar ficheiro de Imagem
|
||||
fileChooser.hoveredDragAndDrop=Arrastar e Largar ficheiro(s) aqui
|
||||
fileChooser.extractPDF=Extraindo...
|
||||
|
||||
#release notes
|
||||
releases.footer=Lançamentos
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Перетащите
|
||||
fileChooser.dragAndDropPDF=Перетащите PDF-файл
|
||||
fileChooser.dragAndDropImage=Перетащите файл изображения
|
||||
fileChooser.hoveredDragAndDrop=Перетащите файл(ы) сюда
|
||||
fileChooser.extractPDF=Извлечение...
|
||||
|
||||
#release notes
|
||||
releases.footer=Релизы
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Povleci in spusti
|
||||
fileChooser.dragAndDropPDF=Povleci in spusti datoteko PDF
|
||||
fileChooser.dragAndDropImage=Povleci in spusti slikovno datoteko
|
||||
fileChooser.hoveredDragAndDrop=Povleci in spusti datoteko(e) sem
|
||||
fileChooser.extractPDF=Izvlečenje...
|
||||
|
||||
#release notes
|
||||
releases.footer=Izdaje
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Dra & Släpp
|
||||
fileChooser.dragAndDropPDF=Dra & Släpp PDF fil
|
||||
fileChooser.dragAndDropImage=Dra & Släpp bildfil
|
||||
fileChooser.hoveredDragAndDrop=Dra & Släpp fil(er) här
|
||||
fileChooser.extractPDF=Extraherar...
|
||||
|
||||
#release notes
|
||||
releases.footer=Utgåvor
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=Drag & Drop
|
||||
fileChooser.dragAndDropPDF=Drag & Drop PDF file
|
||||
fileChooser.dragAndDropImage=Drag & Drop Image file
|
||||
fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
|
||||
fileChooser.extractPDF=Extracting...
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=འཐེན་ནས་འཇོག་པ།
|
||||
fileChooser.dragAndDropPDF=PDF ཡིག་ཆ་འཐེན་ནས་འཇོག་པ།
|
||||
fileChooser.dragAndDropImage=པར་རིས་ཡིག་ཆ་འཐེན་ནས་འཇོག་པ།
|
||||
fileChooser.hoveredDragAndDrop=ཡིག་ཆ་འདིར་འཐེན་ནས་འཇོག་པ།
|
||||
fileChooser.extractPDF=འདོན་རིས་འགྱུར་བའི་སྒྲིག་བཏང་བ།
|
||||
|
||||
#release notes
|
||||
releases.footer=པར་གཞི།
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=拖放文件
|
||||
fileChooser.dragAndDropPDF=拖放PDF文件
|
||||
fileChooser.dragAndDropImage=拖放图片文件
|
||||
fileChooser.hoveredDragAndDrop=拖放文件到此处
|
||||
fileChooser.extractPDF=处理中...
|
||||
|
||||
#release notes
|
||||
releases.footer=版本
|
||||
|
@ -1329,6 +1329,7 @@ fileChooser.dragAndDrop=拖放檔案
|
||||
fileChooser.dragAndDropPDF=拖放 PDF 檔案
|
||||
fileChooser.dragAndDropImage=拖放圖片檔案
|
||||
fileChooser.hoveredDragAndDrop=將檔案拖放至此
|
||||
fileChooser.extractPDF=處理中...
|
||||
|
||||
#release notes
|
||||
releases.footer=版本資訊
|
||||
|
@ -1,5 +1,11 @@
|
||||
export class DecryptFile {
|
||||
|
||||
constructor(){
|
||||
this.decryptWorker = null
|
||||
}
|
||||
|
||||
async decryptFile(file, requiresPassword) {
|
||||
|
||||
try {
|
||||
async function getCsrfToken() {
|
||||
const cookieValue = document.cookie
|
||||
@ -81,12 +87,23 @@ export class DecryptFile {
|
||||
}
|
||||
|
||||
pdfjsLib.GlobalWorkerOptions.workerSrc = './pdfjs-legacy/pdf.worker.mjs';
|
||||
|
||||
const arrayBuffer = await file.arrayBuffer();
|
||||
const arrayBufferForPdfLib = arrayBuffer.slice(0);
|
||||
var loadingTask;
|
||||
|
||||
const loadingTask = pdfjsLib.getDocument({
|
||||
data: arrayBuffer,
|
||||
});
|
||||
if(this.decryptWorker == null){
|
||||
loadingTask = pdfjsLib.getDocument({
|
||||
data: arrayBuffer,
|
||||
});
|
||||
this.decryptWorker = loadingTask._worker
|
||||
|
||||
}else {
|
||||
loadingTask = pdfjsLib.getDocument({
|
||||
data: arrayBuffer,
|
||||
worker: this.decryptWorker
|
||||
});
|
||||
}
|
||||
|
||||
await loadingTask.promise;
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
import FileIconFactory from './file-icon-factory.js';
|
||||
import FileUtils from './file-utils.js';
|
||||
import UUID from './uuid.js';
|
||||
import {DecryptFile} from './DecryptFiles.js';
|
||||
import { DecryptFile } from './DecryptFiles.js';
|
||||
|
||||
let isScriptExecuted = false;
|
||||
if (!isScriptExecuted) {
|
||||
isScriptExecuted = true;
|
||||
@ -11,6 +12,23 @@ if (!isScriptExecuted) {
|
||||
}
|
||||
let hasDroppedImage = false;
|
||||
|
||||
const zipTypes = [
|
||||
'application/zip',
|
||||
'multipart/x-zip',
|
||||
'application/zip-compressed',
|
||||
'application/x-zip-compressed',
|
||||
];
|
||||
|
||||
const mimeTypes = {
|
||||
"png": "image/png",
|
||||
"jpg": "image/jpeg",
|
||||
"jpeg": "image/jpeg",
|
||||
"gif": "image/gif",
|
||||
"bmp": "image/bmp",
|
||||
"svg": "image/svg+xml",
|
||||
"pdf": "application/pdf",
|
||||
};
|
||||
|
||||
function setupFileInput(chooser) {
|
||||
const elementId = chooser.getAttribute('data-bs-element-id');
|
||||
const filesSelected = chooser.getAttribute('data-bs-files-selected');
|
||||
@ -55,6 +73,7 @@ function setupFileInput(chooser) {
|
||||
overlay = false;
|
||||
}
|
||||
|
||||
|
||||
const dropListener = function (e) {
|
||||
e.preventDefault();
|
||||
// Drag and Drop shall only affect the target file chooser
|
||||
@ -83,7 +102,7 @@ function setupFileInput(chooser) {
|
||||
|
||||
dragCounter = 0;
|
||||
|
||||
fileInput.dispatchEvent(new CustomEvent('change', {bubbles: true, detail: {source: 'drag-drop'}}));
|
||||
fileInput.dispatchEvent(new CustomEvent('change', { bubbles: true, detail: { source: 'drag-drop' } }));
|
||||
};
|
||||
|
||||
function pushFileListTo(fileList, container) {
|
||||
@ -114,18 +133,44 @@ function setupFileInput(chooser) {
|
||||
} else {
|
||||
allFiles = Array.from(isDragAndDrop ? allFiles : [element.files[0]]);
|
||||
}
|
||||
|
||||
async function checkZipFile() {
|
||||
|
||||
const promises = allFiles.map(async (file, index) => {
|
||||
try {
|
||||
if (zipTypes.includes(file.type)) {
|
||||
await extractZipFiles(file, element.accept);
|
||||
allFiles.splice(index, 1);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`Error extracting ZIP file (${file.name}):`, error);
|
||||
allFiles.splice(index, 1);
|
||||
}
|
||||
});
|
||||
|
||||
await Promise.all(promises);
|
||||
|
||||
}
|
||||
const originalText = inputContainer.querySelector('#fileInputText').innerHTML;
|
||||
const decryptFile = new DecryptFile();
|
||||
|
||||
inputContainer.querySelector('#fileInputText').innerHTML = window.fileInput.extractPDF;
|
||||
|
||||
await checkZipFile();
|
||||
|
||||
allFiles = await Promise.all(
|
||||
allFiles.map(async (file) => {
|
||||
let decryptedFile = file;
|
||||
|
||||
try {
|
||||
const decryptFile = new DecryptFile();
|
||||
const {isEncrypted, requiresPassword} = await decryptFile.checkFileEncrypted(file);
|
||||
const { isEncrypted, requiresPassword } = await decryptFile.checkFileEncrypted(file);
|
||||
if (file.type === 'application/pdf' && isEncrypted) {
|
||||
decryptedFile = await decryptFile.decryptFile(file, requiresPassword);
|
||||
if (!decryptedFile) throw new Error('File decryption failed.');
|
||||
}
|
||||
decryptedFile.uniqueId = UUID.uuidv4();
|
||||
return decryptedFile;
|
||||
|
||||
} catch (error) {
|
||||
console.error(`Error decrypting file: ${file.name}`, error);
|
||||
if (!file.uniqueId) file.uniqueId = UUID.uuidv4();
|
||||
@ -133,13 +178,15 @@ function setupFileInput(chooser) {
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
inputContainer.querySelector('#fileInputText').innerHTML = originalText;
|
||||
if (!isDragAndDrop) {
|
||||
let dataTransfer = toDataTransfer(allFiles);
|
||||
element.files = dataTransfer.files;
|
||||
}
|
||||
|
||||
handleFileInputChange(this);
|
||||
this.dispatchEvent(new CustomEvent('file-input-change', {bubbles: true, detail: {elementId, allFiles}}));
|
||||
this.dispatchEvent(new CustomEvent('file-input-change', { bubbles: true, detail: { elementId, allFiles } }));
|
||||
});
|
||||
|
||||
function toDataTransfer(files) {
|
||||
@ -147,17 +194,79 @@ function setupFileInput(chooser) {
|
||||
files.forEach((file) => dataTransfer.items.add(file));
|
||||
return dataTransfer;
|
||||
}
|
||||
|
||||
async function extractZipFiles(zipFile, acceptedFileType) {
|
||||
const jszip = new JSZip();
|
||||
var counter = 0;
|
||||
|
||||
// do an overall count, then proceed to make the pdf files
|
||||
await jszip.loadAsync(zipFile)
|
||||
.then(function (zip) {
|
||||
|
||||
zip.forEach(function (relativePath, zipEntry) {
|
||||
counter+=1;
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
if (counter >= 1000) {
|
||||
throw Error("Maximum file reached");
|
||||
}
|
||||
|
||||
return jszip.loadAsync(zipFile)
|
||||
.then(function (zip) {
|
||||
var extractionPromises = [];
|
||||
|
||||
zip.forEach(function (relativePath, zipEntry) {
|
||||
|
||||
const promise = zipEntry.async('blob').then(function (content) {
|
||||
// Assuming that folders have size zero
|
||||
if (content.size > 0) {
|
||||
const extension = zipEntry.name.split('.').pop().toLowerCase();
|
||||
const mimeType = mimeTypes[extension];
|
||||
|
||||
// Check for file extension
|
||||
if (mimeType && (mimeType.startsWith(acceptedFileType.split('/')[0]) || acceptedFileType === mimeType)) {
|
||||
|
||||
var file = new File([content], zipEntry.name, { type: mimeType });
|
||||
file.uniqueId = UUID.uuidv4();
|
||||
allFiles.push(file);
|
||||
|
||||
} else {
|
||||
console.log(`File ${zipEntry.name} skipped. MIME type (${mimeType}) does not match accepted type (${acceptedFileType})`);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
extractionPromises.push(promise);
|
||||
});
|
||||
|
||||
return Promise.all(extractionPromises);
|
||||
})
|
||||
.catch(function (err) {
|
||||
console.error("Error extracting ZIP file:", err);
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
|
||||
function handleFileInputChange(inputElement) {
|
||||
|
||||
const files = allFiles;
|
||||
|
||||
showOrHideSelectedFilesContainer(files);
|
||||
|
||||
const filesInfo = files.map((f) => ({
|
||||
name: f.name,
|
||||
size: f.size,
|
||||
uniqueId: f.uniqueId,
|
||||
type: f.type,
|
||||
url: URL.createObjectURL(f),
|
||||
}));
|
||||
const filesInfo = files.map((f) => {
|
||||
|
||||
const url = URL.createObjectURL(f);
|
||||
|
||||
return {
|
||||
name: f.name,
|
||||
size: f.size,
|
||||
uniqueId: f.uniqueId,
|
||||
type: f.type,
|
||||
url: url,
|
||||
};
|
||||
});
|
||||
|
||||
const selectedFilesContainer = $(inputContainer).siblings('.selected-files');
|
||||
selectedFilesContainer.empty();
|
||||
@ -171,6 +280,8 @@ function setupFileInput(chooser) {
|
||||
let fileIconContainer = document.createElement('div');
|
||||
const isDragAndDropEnabled =
|
||||
window.location.pathname.includes('add-image') || window.location.pathname.includes('sign');
|
||||
|
||||
// add image thumbnail to it
|
||||
if (info.type.startsWith('image/')) {
|
||||
let imgPreview = document.createElement('img');
|
||||
imgPreview.src = info.url;
|
||||
@ -283,7 +394,7 @@ function setupFileInput(chooser) {
|
||||
|
||||
showOrHideSelectedFilesContainer(allFiles);
|
||||
|
||||
inputElement.dispatchEvent(new CustomEvent('file-input-change', {bubbles: true}));
|
||||
inputElement.dispatchEvent(new CustomEvent('file-input-change', { bubbles: true }));
|
||||
}
|
||||
|
||||
function removeFileById(fileId, inputElement) {
|
||||
|
@ -219,20 +219,23 @@
|
||||
};
|
||||
window.fileInput = {
|
||||
dragAndDropPDF: '[[#{fileChooser.dragAndDropPDF}]]',
|
||||
dragAndDropImage: '[[#{fileChooser.dragAndDropImage}]]'
|
||||
dragAndDropImage: '[[#{fileChooser.dragAndDropImage}]]',
|
||||
extractPDF: '[[#{fileChooser.extractPDF}]]'
|
||||
};</script>
|
||||
<div class="custom-file-chooser mb-3"
|
||||
th:attr="data-bs-unique-id=${name}, data-bs-element-id=${name+'-input'}, data-bs-element-container-id=${name+'-input-container'}, data-bs-files-selected=#{filesSelected}, data-bs-pdf-prompt=#{pdfPrompt}">
|
||||
<div class="mb-3 d-flex flex-row justify-content-center align-items-center flex-wrap input-container"
|
||||
th:name="${name}+'-input'" th:id="${name}+'-input-container'" th:data-text="#{fileChooser.hoveredDragAndDrop}">
|
||||
<label class="file-input-btn d-none">
|
||||
<input type="file" class="form-control" th:name="${name}" th:id="${name}+'-input'" th:accept="${accept}"
|
||||
<input type="file" class="form-control" th:name="${name}" th:id="${name}+'-input'" th:accept="${accept} + ',.zip'"
|
||||
th:attr="multiple=${!disableMultipleFiles}" th:required="${notRequired} ? null : 'required'">
|
||||
Browse
|
||||
</label>
|
||||
<div th:text="#{fileChooser.click}"></div>
|
||||
<div th:text="#{fileChooser.or}"></div>
|
||||
<div th:text="#{fileChooser.dragAndDrop}" id="dragAndDrop"></div>
|
||||
<div class="d-flex justify-content-start align-items-center" id="fileInputText">
|
||||
<div th:text="#{fileChooser.click}" style="margin-right: 5px"></div>
|
||||
<div th:text="#{fileChooser.or}" style="margin-right: 5px"></div>
|
||||
<div th:text="#{fileChooser.dragAndDrop}" id="dragAndDrop"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="selected-files flex-wrap"></div>
|
||||
</div>
|
||||
|
Loading…
Reference in New Issue
Block a user