FileUtil.ts 4.5 KB

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