合同小程序前端代码仓库
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.
 
 
 
 
 

137 lines
4.5 KiB

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)
}
}
}