You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
398 lines
15 KiB
398 lines
15 KiB
import { sys } from "cc";
|
|
import FileBase from "../FileBase";
|
|
import { READ_FILE_TYPE, FileReaderData,JsZIPFileData, filedataType } from "../FileEnum";
|
|
import FileTools from "../FileTools";
|
|
|
|
export default class FileWeb extends FileBase{
|
|
onLoad() {
|
|
|
|
}
|
|
openLocalDirectoryCallBack(CallBack: Function, accept?: string) {
|
|
|
|
}
|
|
GlobalWriteStringToFile(file_txt: string, filepath?: string) {
|
|
|
|
}
|
|
CreateDirectory(path: string) {
|
|
|
|
}
|
|
openLocalDirectory(accept: string, callback: (file: any) => void) {
|
|
|
|
}
|
|
readLocalFile(file: any, readType: any, callback: (result: any) => void) {
|
|
this.ReadFileInfo2(file,callback);
|
|
}
|
|
|
|
/**
|
|
* 写入文件
|
|
* @param file_txt 需要写入的文本
|
|
* @param fileName 文件名记得自己加后缀
|
|
*/
|
|
ProjectWriteStringToFile(file_txt: string, fileName: string) {
|
|
if (sys.isBrowser) {
|
|
let textFileAsBlob = new Blob([file_txt], { type: 'application/json' });
|
|
let downloadLink = document.createElement("a");
|
|
downloadLink.download = fileName;
|
|
downloadLink.innerHTML = "Download File";
|
|
if (window.webkitURL != null) {
|
|
downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
|
|
} else {
|
|
downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
|
|
downloadLink.style.display = "none";
|
|
document.body.appendChild(downloadLink);
|
|
}
|
|
downloadLink.click();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 打开文件选择器
|
|
*
|
|
* @param {string} accept
|
|
* @param {(file: File) => void} callback
|
|
* @memberof FileMgr
|
|
*/
|
|
openLocalFile(accept: string, callback: (file: File) => void) {
|
|
let inputEl: HTMLInputElement = <HTMLInputElement>document.getElementById('file_input');
|
|
//if (!inputEl) {
|
|
// ConsoleEx.Log('xxxxxx createElement input');
|
|
inputEl = document.createElement('input');
|
|
inputEl.id = 'file_input';
|
|
inputEl.setAttribute('id', 'file_input');
|
|
inputEl.setAttribute('type', 'file');
|
|
inputEl.setAttribute('class', 'fileToUpload');
|
|
inputEl.style.opacity = '0';
|
|
inputEl.style.position = 'absolute';
|
|
inputEl.setAttribute('left', '-999px');
|
|
document.body.appendChild(inputEl);
|
|
//}
|
|
|
|
accept = accept || ".*";
|
|
inputEl.setAttribute('accept', accept);
|
|
inputEl.onchange = (event) => {
|
|
let files = inputEl.files
|
|
if (files && files.length > 0) {
|
|
var file = files[0];
|
|
if (callback) callback(file);
|
|
}
|
|
}
|
|
inputEl.click();
|
|
}
|
|
|
|
/**
|
|
* 打开文件选择器+读取数据
|
|
*
|
|
* @memberof WriteFile
|
|
*/
|
|
openLocalFileCallBack(CallBack: Function,accept:string=".*") {
|
|
// 打开文件选择器
|
|
this.openLocalFile(accept, (file) => {
|
|
// 读取数据
|
|
this.readLocalFile(file, 1, (result) => {
|
|
CallBack && CallBack(result, file);
|
|
})
|
|
|
|
});
|
|
}
|
|
|
|
CretedropHandler(TempdropHandler: Function) {
|
|
var oDragWrap = document.body;
|
|
//拖进
|
|
oDragWrap.addEventListener(
|
|
"dragenter",
|
|
function (e) {
|
|
e.preventDefault();
|
|
},
|
|
false
|
|
);
|
|
//拖离
|
|
oDragWrap.addEventListener(
|
|
"dragleave",
|
|
function (e) {
|
|
//dragleaveHandler(e);
|
|
e.preventDefault();
|
|
},
|
|
false
|
|
);
|
|
//拖来拖去 , 一定要注意dragover事件一定要清除默认事件
|
|
//不然会无法触发后面的drop事件
|
|
oDragWrap.addEventListener(
|
|
"dragover",
|
|
function (e) {
|
|
e.preventDefault();
|
|
},
|
|
false
|
|
);
|
|
//扔
|
|
oDragWrap.addEventListener(
|
|
"drop",
|
|
function (e) {
|
|
e.preventDefault()
|
|
dropHandler(e);
|
|
},
|
|
false
|
|
);
|
|
var dropHandler = (function (e) {
|
|
//将本地图片拖拽到页面中后要进行的处理都在这
|
|
//let listing = document.getElementById("listing");
|
|
let fileList = e.dataTransfer.files;
|
|
ConsoleEx.Log(fileList);
|
|
let items = e.dataTransfer.items;
|
|
//listing.innerHTML = "";
|
|
|
|
let DataList: FileReaderData[] = [];
|
|
|
|
if (items && items.length) {
|
|
for (let i = 0; i < items.length; i++) {
|
|
// file 对象(按实例拖拽的内容)转换成 FileSystemFileEntry 对象 或 FileSystemDirectoryEntry 对象
|
|
let item = items[i].webkitGetAsEntry();
|
|
if (item) {
|
|
// 如果是目录,则递归读取
|
|
if (item.isDirectory) {
|
|
this.ReadDirectoryReader(item,DataList,TempdropHandler,item.name);
|
|
} else {
|
|
if(item.isFile){
|
|
item.file((file)=>{
|
|
this.ReadFileInfo(file, DataList, TempdropHandler, this);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (fileList && fileList.length) {
|
|
for (let i = 0; i < fileList.length; i++) {
|
|
const file = fileList[i];
|
|
this.ReadFileInfo(file, DataList, TempdropHandler, this);
|
|
}
|
|
};
|
|
}
|
|
}).bind(this)
|
|
|
|
}
|
|
|
|
ReadDirectoryReader(item,DataList: FileReaderData[],TempdropHandler,path:string=""){
|
|
//使用目录实体来创建 FileSystemDirectoryReader 实例
|
|
let directoryReader = item.createReader();
|
|
// 上面只是创建了 reader 实例,现在使用 reader 实例来读取 目录实体(读取目录内容)
|
|
directoryReader.readEntries(((function (entries) {
|
|
// 循环目录内容
|
|
entries.forEach((function (entry) {
|
|
// 处理内容(递归)
|
|
if (entry.isFile) {
|
|
entry.file((file) => {
|
|
this.ReadFileInfo(file, DataList, TempdropHandler, this,path);
|
|
});
|
|
}else{
|
|
this.ReadDirectoryReader(entry, DataList, TempdropHandler, path + item.name);
|
|
}
|
|
//scanFiles(entry, directoryContainer);
|
|
}).bind(this));
|
|
}).bind(this)).bind(this));
|
|
}
|
|
|
|
|
|
ReadFileInfo(file:File, datalist: FileReaderData[], TempdropHandler, targt,path:string="") {
|
|
let tdata = new FileReaderData();
|
|
|
|
if (file.type.includes("image")) {
|
|
tdata.Type = filedataType.image;
|
|
} else if (file.type.includes("text")) {
|
|
tdata.Type = filedataType.text;
|
|
} else if (file.type.includes("json")) {
|
|
tdata.Type = filedataType.Json;
|
|
} else {
|
|
if(file.name .includes(".atlas")){
|
|
tdata.Type = filedataType.atlas;
|
|
}else{
|
|
tdata.Type = filedataType.null;
|
|
return;
|
|
}
|
|
}
|
|
datalist.push(tdata);
|
|
tdata.path = path;
|
|
tdata.name = file.name;
|
|
//创建一个文件读取对象的实例
|
|
let reader = new FileReader()
|
|
switch (tdata.Type) {
|
|
case filedataType.image:
|
|
reader.readAsDataURL(file)
|
|
break;
|
|
case filedataType.text:
|
|
reader.readAsText(file)
|
|
break;
|
|
case filedataType.Json:
|
|
reader.readAsText(file)
|
|
break;
|
|
case filedataType.atlas:
|
|
reader.readAsText(file)
|
|
break;
|
|
case filedataType.null:
|
|
reader.readAsDataURL(file);
|
|
break;
|
|
}
|
|
// 此实例的方法
|
|
// reader.readAsBinaryString(file) //使用原始二进制的字符串来展示文件数据
|
|
// reader.readAsDataURL() //使用URL来展示文件数据
|
|
// raeder.readAsArrayBuffer() //使用指定的二进制对象来读取内容
|
|
// raeder.readAsText() //使用文本字符串来展示文件数据
|
|
reader.onloadend = (e) => {
|
|
// 在执行下面内容时,要先判断其状态。其中属性readyState代表文件当前状态,
|
|
// 1为loading,表示正在加载;
|
|
// 0为empty,未加载任何数据;
|
|
// 2为done,表示加载完毕
|
|
if (e.target.readyState === FileReader.DONE) { // 判断文件加载完毕,执行以下内容
|
|
let result = reader.result;
|
|
tdata.value = result;
|
|
switch (tdata.Type) {
|
|
case filedataType.image:
|
|
FileTools.base64ToTexture2D(result as string, (texture) => {
|
|
tdata.texture = texture;
|
|
tdata.state = 2;
|
|
if (targt.CheckList(datalist)) {
|
|
ConsoleEx.Log("全部读取完成");
|
|
TempdropHandler && TempdropHandler(datalist);
|
|
}
|
|
});
|
|
break;
|
|
default:
|
|
tdata.state = 2;
|
|
if (targt.CheckList(datalist)) {
|
|
ConsoleEx.Log("全部读取完成");
|
|
TempdropHandler && TempdropHandler(datalist);
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
ReadFileInfo2(file:File, TempdropHandler) {
|
|
let tdata = new FileReaderData();
|
|
|
|
if (file.type.includes("image")) {
|
|
tdata.Type = filedataType.image;
|
|
} else if (file.type.includes("text")) {
|
|
tdata.Type = filedataType.text;
|
|
} else if (file.type.includes("json")) {
|
|
tdata.Type = filedataType.Json;
|
|
} else {
|
|
if(file.name .includes(".atlas")){
|
|
tdata.Type = filedataType.atlas;
|
|
}else{
|
|
tdata.Type = filedataType.null;
|
|
return;
|
|
}
|
|
}
|
|
tdata.name = file.name;
|
|
//创建一个文件读取对象的实例
|
|
let reader = new FileReader()
|
|
switch (tdata.Type) {
|
|
case filedataType.image:
|
|
reader.readAsDataURL(file)
|
|
break;
|
|
case filedataType.text:
|
|
reader.readAsText(file)
|
|
break;
|
|
case filedataType.Json:
|
|
reader.readAsText(file)
|
|
break;
|
|
case filedataType.atlas:
|
|
reader.readAsText(file)
|
|
break;
|
|
case filedataType.null:
|
|
reader.readAsDataURL(file);
|
|
break;
|
|
}
|
|
// 此实例的方法
|
|
// reader.readAsBinaryString(file) //使用原始二进制的字符串来展示文件数据
|
|
// reader.readAsDataURL() //使用URL来展示文件数据
|
|
// raeder.readAsArrayBuffer() //使用指定的二进制对象来读取内容
|
|
// raeder.readAsText() //使用文本字符串来展示文件数据
|
|
reader.onloadend = (e) => {
|
|
// 在执行下面内容时,要先判断其状态。其中属性readyState代表文件当前状态,
|
|
// 1为loading,表示正在加载;
|
|
// 0为empty,未加载任何数据;
|
|
// 2为done,表示加载完毕
|
|
if (e.target.readyState === FileReader.DONE) { // 判断文件加载完毕,执行以下内容
|
|
let result = reader.result;
|
|
tdata.value = result;
|
|
switch (tdata.Type) {
|
|
case filedataType.image:
|
|
FileTools.base64ToTexture2D(result as string, (texture) => {
|
|
tdata.texture = texture;
|
|
tdata.state = 2;
|
|
TempdropHandler && TempdropHandler(tdata);
|
|
});
|
|
break;
|
|
default:
|
|
tdata.state = 2;
|
|
TempdropHandler && TempdropHandler(tdata);
|
|
break;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
CheckList(datalist: FileReaderData[]){
|
|
for (let i = 0; i < datalist.length; i++) {
|
|
const element = datalist[i];
|
|
if (!element.state) {
|
|
return false
|
|
}
|
|
}
|
|
//var zip = new JSZip();
|
|
return true;
|
|
}
|
|
|
|
CreateZip(JsZIPFileData:JsZIPFileData[],zipName:string) {
|
|
if (sys.isBrowser && JsZIPFileData.length) {
|
|
let downloadLink = document.createElement("a");
|
|
downloadLink.download = `${zipName}.zip`;
|
|
downloadLink.innerHTML = "Download File";
|
|
const zip = new JSZip()
|
|
for (let i = 0; i < JsZIPFileData.length; i++) {
|
|
let tZip = zip;
|
|
const data = JsZIPFileData[i];
|
|
for (let j = 0; j < data.folder.length; j++) {
|
|
const folder = data.folder[j];
|
|
tZip = tZip.folder(folder);
|
|
}
|
|
for (let j = 0; j < data.File.length; j++) {
|
|
const flie = data.File[j];
|
|
if(flie.Type == filedataType.image){
|
|
let image = flie.value as string;
|
|
image = image.replace(/^data:image\/(png|jpg|jpeg);base64,/, "");
|
|
tZip = tZip.file(flie.name,image,{base64: true});
|
|
}else{
|
|
tZip = tZip.file(flie.name,flie.value);
|
|
}
|
|
}
|
|
}
|
|
zip.generateAsync({
|
|
type: 'blob',
|
|
compression: 'DEFLATE', // STORE: 默认不压缩, DEFLATE:需要压缩
|
|
compressionOptions: {
|
|
level: 1 // 压缩等级 1~9 1 压缩速度最快, 9 最优压缩方式
|
|
}
|
|
}).then((res: any) => {
|
|
if (window.webkitURL != null) {
|
|
downloadLink.href = window.webkitURL.createObjectURL(res);
|
|
} else {
|
|
downloadLink.href = window.URL.createObjectURL(res);
|
|
downloadLink.style.display = "none";
|
|
document.body.appendChild(downloadLink);
|
|
}
|
|
downloadLink.click();
|
|
})
|
|
|
|
}
|
|
}
|
|
|
|
|
|
}
|