• JS上传文件(base64字符串和二进制文件流)


    ①以base64字符串上传(使用FileReader对象获取文件的base64字符串)

    FileReader参考文档: FileReader - Web API 接口参考 | MDN

    FileReader 对象允许 Web 应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

    FileReader

    • readAsArrayBuffer():开始读取指定的 Blob中的内容,一旦完成,result 属性中保存的将是被读取文件的ArrayBuffer 数据对象
    • readAsBinaryString():开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据
    • readAsDataURL():开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL 格式的 Base64 字符串以表示所读取文件的内容。
    • readAsText():开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容
    1. ref="upload"
    2. type="file"
    3. accept="image/*,application/pdf"
    4. @change="uploadFile($event.target.files)"
    5. style="display: none;" />
    6. <div @click="$ref.upload.click()" class="m-upload">选择文件div>
    7. <div @click="$refs.upload.click()" ref="dragUpload" class="m-upload">
    8. <img src="@/assets/images/add-upload.svg" class="u-upload" />
    9. <div class="assist">div>
    10. div>
    11. mounted () {
    12. // 将ref为dragUpload的元素变成drop区域
    13. this.$refs.dragUpload.addEventListener('dragenter', this.dragenter, false)
    14. this.$refs.dragUpload.addEventListener('dragover', this.dragover, false)
    15. this.$refs.dragUpload.addEventListener('drop', this.drop, false)
    16. },
    17. methods: {
    18. dragenter (e) {
    19. e.stopPropagation()
    20. e.preventDefault()
    21. this.$once('hook:beforeDestroy', function () {
    22. removeEventListener('dragenter', this.dragenter)
    23. })
    24. },
    25. dragover (e) {
    26. e.stopPropagation()
    27. e.preventDefault()
    28. this.$once('hook:beforeDestroy', function () {
    29. removeEventListener('dragover', this.dragover)
    30. })
    31. },
    32. drop (e) { // 拖拽上传方法
    33. e.stopPropagation()
    34. e.preventDefault()
    35. const files = e.dataTransfer.files
    36. this.uploadFile(files)
    37. this.$once('hook:beforeDestroy', function () {
    38. removeEventListener('drop', this.drop)
    39. })
    40. },
    41. uploadFile (files) { // 统一上传文件方法
    42. console.log('开始上传 upload-event files:', files)
    43. if (files.length) {
    44. var reader = new FileReader()
    45. // reader.readAsBinaryString(files[0])
    46. reader.readAsDataURL(files[0]) // 以base64方式读取文件内容
    47. reader.onloadstart = function (e) { // 当读取操作开始时触发
    48. const fileSize = e.total
    49. if (fileSize > 1024 * 500) { // 大于500KB时取消上传
    50. reader.abort()
    51. } else {
    52. console.log('开始读取 onloadstart:', e)
    53. }
    54. }
    55. reader.onabort = function (e) { // 当读取操作被中断时触发
    56. console.log('读取中止 onabort:', e)
    57. }
    58. reader.onerror = function (e) { // 当读取操作发生错误时触发
    59. console.log('读取错误 onerror:', e)
    60. }
    61. reader.onprogress = function (e) { // 在读取Blob时触发,读取上传进度,50ms左右调用一次
    62. console.log('读取中 onprogress:', e)
    63. console.log('已读取:', Math.ceil(e.loaded / e.total * 100) + '%')
    64. }
    65. const that = this
    66. reader.onload = function (e) { // 当读取操作成功完成时调用
    67. console.log('读取成功 onload:', e)
    68. // 该文件的base64数据,前端可直接用来展示图片
    69. // that.preImg = e.target.result
    70. // 若使用标签展示图片,可直接赋值src属性
    71. // document.getElementById('img').src = e.target.result
    72. // 调用上传接口,上传base64格式的文件数据
    73. const fileType = files[0].type.slice(files[0].type.indexOf('/') + 1)
    74. var formData = {
    75. uploadFile: e.target.result,
    76. fileFormat: fileType
    77. }
    78. console.log('提交数据:', formData)
    79. upload(formData).then(res => {
    80. console.log('upload-res:', res)
    81. if (res.message.code === 0) {
    82. that.fileUrl = res.data.url
    83. }
    84. }).finally(() => {
    85. // input的change事件默认保存上一次input的value值,同一value值(根据文件路径判断)在上传时不重新加载
    86. that.$refs.upload.value = ''
    87. })
    88. }
    89. reader.onloadend = function (e) { // 当读取操作结束时触发(要么成功,要么失败)触发
    90. console.log('读取结束 onloadend:', e)
    91. }
    92. }
    93. }
    94. }
    95. .m-upload { // 拖动区域元素
    96. position: relative;
    97. display: inline-block;
    98. width: 98px;
    99. height: 98px;
    100. background: #FFFFFF;
    101. border: 1px dashed #D1D1D1;
    102. text-align: center;
    103. cursor: pointer;
    104. .u-upload { // 垂直居中
    105. width: 20px;
    106. height: 20px;
    107. display: inline-block;
    108. vertical-align: middle;
    109. }
    110. .assist { // 垂直居中辅助元素
    111. height: 100%;
    112. width: 0;
    113. display: inline-block;
    114. vertical-align: middle;
    115. }
    116. }

    ②以二进制文件流上传(使用FormData模拟form表单提交)

    FormData参考文档: FormData - Web API 接口参考 | MDN

    FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为 "multipart/form-data",它会使用和表单一样的格式

    实现了 FormData 接口的对象可以直接在for...of结构中使用,而不需要调用entries() : for (var p of myFormData) 的作用和 for (var p of myFormData.entries()) 是相同的。

    FormData方法

    • FormData.append():向 FormData 中添加新的属性值,FormData 对应的属性值存在也不会覆盖原值,而是新增一个值,如果属性不存在则新增一项属性值。
    • FormData.delete():从 FormData 对象里面删除一个键值对
    • FormData.entries():返回一个包含所有键值对的iterator对象
    • FormData.get():返回在 FormData 对象中与给定键关联的第一个值
    • FormData.getAll():返回一个包含 FormData 对象中与给定键关联的所有值的数组。
    • FormData.has():返回一个布尔值表明 FormData 对象是否包含某些键。
    • FormData.keys():返回一个包含所有键的iterator对象
    • FormData.set():给 FormData 设置属性值,如果FormData 对应的属性值存在则覆盖原值,否则新增一项属性值
    • FormData.values():返回一个包含所有值的iterator对象
    1. uploadFile (files) {
    2. console.log('开始上传 upload-event files:', files)
    3. if (files.length) {
    4. if (files[0].size > 500 * 1024) { // 校验文件大小
    5. this.content = '文件大小不能超过500KB'
    6. this.showTip = true
    7. } else {
    8. const fileType = files[0].type.slice(files[0].type.indexOf('/') + 1)
    9. var formData = new FormData()
    10. formData.set('uploadFile', files[0])
    11. formData.set('fileFormat', fileType)
    12. // 调用接口上传文件
    13. upload(formData).then(res => {
    14. console.log('upload-res:', res)
    15. if (res.message.code === 0) {
    16. this.fileUrl = res.data.url
    17. }
    18. }).finally(() => {
    19. this.$refs.upload.value = ''
    20. })
    21. }
    22. }
    23. }
  • 相关阅读:
    自动化测试框架Playwright安装以及使用
    Python突破浏览器TLS/JA3 指纹
    ASRT从零搭建并测试
    el-tree自定义节点内容
    亚马逊云科技AI创新应用下的托管在AWS上的数据可视化工具—— Amazon QuickSight
    【论文速读】| GPTFUZZER:利用自动生成的越狱提示对大型语言模型进行红队测试
    C Primer Plus(6) 中文版 第10章 数组和指针 10.7 指针和多维数组
    查找与排序
    Java之抽象类与接口
    uni-app使用echarts图表给图表添加点击事件/uni-app 解决echarts在h5中 tooltips及部分功能失效问题:
  • 原文地址:https://blog.csdn.net/Dandrose/article/details/127089082