FileUtil.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. * 文件操作工具类
  3. * @author 薛鸿潇
  4. */
  5. export default class FileUtil {
  6. /**
  7. * 打开文件选择器
  8. * @param {string} accept
  9. * @param {(file: File) => void} callback
  10. * @memberof FileUtil
  11. */
  12. public openLocalFile(accept: string, callback: (file: File) => void) {
  13. let inputEl: HTMLInputElement = <HTMLInputElement>document.getElementById('file_input');
  14. if (!inputEl) {
  15. inputEl = document.createElement('input');
  16. inputEl.id = 'file_input';
  17. inputEl.setAttribute('id', 'file_input');
  18. inputEl.setAttribute('type', 'file');
  19. inputEl.setAttribute('class', 'fileToUpload');
  20. inputEl.style.opacity = '0';
  21. inputEl.style.position = 'absolute';
  22. inputEl.setAttribute('left', '-999px');
  23. document.body.appendChild(inputEl);
  24. }
  25. accept = accept || ".*";
  26. inputEl.setAttribute('accept', accept);
  27. inputEl.onchange = (event) => {
  28. let files = inputEl.files
  29. if (files && files.length > 0) {
  30. var file = files[0];
  31. if (callback) callback(file);
  32. }
  33. }
  34. inputEl.click();
  35. }
  36. /**
  37. * 读取本地文件数据
  38. * @param {File} file
  39. * @param {READ_FILE_TYPE} readType
  40. * @param {((result: string | ArrayBuffer) => void)} callback
  41. * @memberof FileUtil
  42. */
  43. public readLocalFile(file: File, readType: READ_FILE_TYPE, callback: (result: string | ArrayBuffer) => void) {
  44. var reader = new FileReader();
  45. reader.onload = function (event) {
  46. if (callback) {
  47. if (reader.readyState == FileReader.DONE) {
  48. callback(reader.result);
  49. } else {
  50. callback(null);
  51. }
  52. }
  53. };
  54. switch (readType) {
  55. case READ_FILE_TYPE.DATA_URL:
  56. reader.readAsDataURL(file);
  57. break;
  58. case READ_FILE_TYPE.TEXT:
  59. reader.readAsText(file);// 作为字符串读出
  60. break;
  61. case READ_FILE_TYPE.BINARY:
  62. reader.readAsBinaryString(file);
  63. break;
  64. case READ_FILE_TYPE.ARRAYBUFFER:
  65. reader.readAsArrayBuffer(file);
  66. break;
  67. }
  68. }
  69. /**
  70. * 保存数据到本地
  71. * @param {*} fileNameToSaveAs 要保存的文件名
  72. * @param {*} textToWrite 要保存的文件内容
  73. * @memberof FileUtil
  74. */
  75. public saveForBrowser(fileNameToSaveAs: any, textToWrite: any) {
  76. if (cc.sys.isBrowser) {
  77. console.log("浏览器");
  78. let textFileAsBlob = new Blob([textToWrite], { type: 'application/json' });
  79. let downloadLink = document.createElement("a");
  80. downloadLink.download = fileNameToSaveAs;
  81. downloadLink.innerHTML = "Download File";
  82. if (window.webkitURL != null) {
  83. // Chrome allows the link to be clicked
  84. // without actually adding it to the DOM.
  85. downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
  86. } else {
  87. // Firefox requires the link to be added to the DOM
  88. // before it can be clicked.
  89. downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
  90. // downloadLink.onclick = destroyClickedElement;
  91. downloadLink.style.display = "none";
  92. document.body.appendChild(downloadLink);
  93. }
  94. downloadLink.click();
  95. }
  96. }
  97. }
  98. /**
  99. * 读取文件方式
  100. */
  101. enum READ_FILE_TYPE {
  102. DATA_URL,// readAsDataURL, base64
  103. TEXT,// readAsText
  104. BINARY,// readAsBinaryString
  105. ARRAYBUFFER,// readAsArrayBuffer
  106. }