|
|
- import { UTSiOS } from "DCloudUTSFoundation"
- import { URL, FileManager, NSData, Data } from 'Foundation';
- import { UTTypeCreatePreferredIdentifierForTag, kUTTagClassFilenameExtension, UTTypeCopyPreferredTagWithClass, kUTTagClassMIMEType } from "MobileCoreServices"
- import { ProcessFileOptions, NullableString } from '../interface'
- import { Bool } from 'Swift';
-
-
- export function getResourcePath(filePath : string) : string {
- let path = filePath;
- if (path.startsWith("http") || path.startsWith("<svg") || path.startsWith("data:image/")) {
- return path
- }
- if (path.startsWith("file://")) {
- path = path.substring(7) //path.replace("file://", "")
- } else if (!path.startsWith("/var/")) {
- path = UTSiOS.getResourcePath(filePath);
- }
- return path
- }
-
- /**
- *
- */
- export function checkExistence(filePath : string):boolean[] {
- let path = getResourcePath(filePath)
- let isDirectory:ObjCBool = false
- const exists = FileManager.default.fileExists(atPath = path, isDirectory = UTSiOS.getPointer(isDirectory))
- return [exists,isDirectory.boolValue]
- }
-
- export function isFile(filePath : string):boolean {
- const result = checkExistence(filePath);
- return result[0] && !result[1]
- }
- export function isExists(filePath : string):boolean {
- const result = checkExistence(filePath);
- return result[0]
- }
- export function isDirectory(filePath : string):boolean {
- const result = checkExistence(filePath);
- return result[0] && result[1]
- }
-
-
- function getMimeType(filePath : string) : NullableString {
- let path = getResourcePath(filePath)
- if(!FileManager.default.fileExists(atPath = path)) return null
- const pathExtension = new URL(fileURLWithPath = path).pathExtension;
- const mimeType = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, null)?.takeRetainedValue()
- if(mimeType == null) return null
- const mimeTypeString = UTTypeCopyPreferredTagWithClass(mimeType!, kUTTagClassMIMEType)?.takeRetainedValue();
- if(mimeTypeString == null) return null
- return mimeTypeString as string
- }
-
- export function fileToBase64(filePath : string) : NullableString {
- let path = getResourcePath(filePath)
- if(!FileManager.default.fileExists(atPath = path)) return null;
- const fileData = FileManager.default.contents(atPath = path);
- if(fileData == null) return null;
- return fileData!.base64EncodedString(options = NSData.Base64EncodingOptions.lineLength64Characters)//.replace(/\s+/g,'')
- }
-
- export function fileToDataURL(filePath : string) : NullableString {
- const base64 = fileToBase64(filePath)
- const mimeType = getMimeType(filePath)
- if(base64 == null || mimeType == null) return null
- return ("data:" + mimeType! + ";base64," + base64!)//.replace(/\s+/g,'');
- }
-
- function getFileExtensionFromDataURL(dataURL : string) : string {
- const commaIndex = dataURL.indexOf(",");
- const mimeType = dataURL.substring(0, commaIndex).replace("data:", "").replace(";base64", "");
- const mimeTypeParts = mimeType.split("/");
- return mimeTypeParts[1];
- }
-
-
- export function dataURLToFile(dataURL : string, filename : NullableString = null) : NullableString {
-
- const commaIndex = dataURL.indexOf(",");
- const base64 = dataURL.substring(commaIndex + 1);
- const data = new Data(base64Encoded = base64);
- // #ifdef UNI-APP-X
- const dataPath = UTSiOS.getDataPath();
- // #endif
- // #ifndef UNI-APP-X
- const dataPath = UTSiOS.getDataPath().replace(/data$/, "doc");
- // #endif
- const name = filename ?? `${Date.now()}.${getFileExtensionFromDataURL(dataURL)}`;
- if(data == null) return null
-
- let temporaryDirectoryURL = new URL(fileURLWithPath = dataPath);
- let fileURL = temporaryDirectoryURL.appendingPathComponent(name);
- try{
- UTSiOS.try(data!.write(to = fileURL))
- return `${dataPath}/${name}`
- }catch(e){
- return null
- }
- }
-
-
-
- export function processFile(options: ProcessFileOptions){
- if(options.type == 'toBase64'){
- const res = fileToBase64(options.path)
- const err = 'fileToBase64: 解析失败'
- if(res != null){
- options.success?.(res!)
- options.complete?.(res!)
- } else {
- options.complete?.(err)
- options.fail?.(err)
- }
- } else if(options.type == 'toDataURL'){
- const res = fileToDataURL(options.path)
- const err = 'fileToDataURL: 解析失败'
- if(res != null){
- options.success?.(res!)
- options.complete?.(res!)
- } else {
- options.complete?.(err)
- options.fail?.(err)
- }
- } else if(options.type == 'toFile'){
- const res = dataURLToFile(options.path, options.filename)
- const err = 'dataURLToFile: 解析失败'
- if(res != null){
- options.success?.(res!)
- options.complete?.(res!)
- } else {
- options.complete?.(err)
- options.fail?.(err)
- }
- }
- }
|