文件处理:上传本地文件至云端 - 图1

Input元素

  1. const handleChange = (event) => {
  2. console.log(event.target) // <input />
  3. console.log(event.target.value) // C:\fakepath\xflow_hjq_test.json
  4. console.log(event.target.files) // FileList[{...}]
  5. }
  6. <input type='file' onchange={handleChange}/>

获取文件信息
选择文件后,触发 onchange 事件

event.target.valuestring虚假路径+文件名

  • 为什么无法获取完整路径?
    • 浏览器处于安全性考虑,无法获取文件的路径
  • 如何获取路径?
    • 修改浏览器设置

event.target.filesFileList ,会有文件信息(为什么是个list?应该可以同时选多个文件)

  • File文件属性 MDN
    • name:string,文件名
    • size:number,文件大小,单位byte
    • lastModified:number,最后修改时间的时间戳
    • lastModifiedDate:Date,最后修改时间的Date
    • type:string,文件类型
      image.png

问题:

  • 重复上传同一个文件,不触发onchange函数
    • 解决方法:onchange后重置valueevent.target.value = ''

图片上传

File类型数据

url

url可以用于显示本地上传的图片,Base64的字符串。
‘blob:http://localhost:9000/161b1b55-45ed-4e92-ac7c-60e5436c61ff’

File转url

  1. const readImageURL = (file: File) => {
  2. return new Promise((resolve) => {
  3. if (URL) {
  4. resolve(URL.createObjectURL(file));
  5. } else if (FileReader) {
  6. const reader = new FileReader();
  7. reader.onload = function () {
  8. resolve(reader.result);
  9. };
  10. reader.readAsDataURL(file);
  11. }
  12. });
  13. };

blob

url转blob
image.png

blob 通过oss api可上传

  1. Axios({
  2. url: src,
  3. responseType: "blob",
  4. }).then((res) => {
  5. callback(res.data);
  6. });

oss api
支持Buffer.from 和 blob上传

  1. await client.put(
  2. objectName,
  3. // Buffer.from(JSON.stringify(fileContent))
  4. fileContent
  5. );

json上传

File

file读成object内存

  1. const reader = new FileReader()
  2. reader.readAsText(file)
  3. reader.onload = (e) => {
  4. let fileContent = null
  5. try{
  6. fileContent = JSON.parse(e.target.result)
  7. callback(fileContent)
  8. } catch(err) {
  9. enqueueSnackbar('JSON parsed failed, please check your file\'s syntax!', {
  10. variant: 'error'
  11. })
  12. return
  13. }
  14. }

Object

  1. Buffer.from(JSON.stringify(fileContent))

Buffer

  1. await client.put(objectName, Buffer.from(JSON.stringify(fileContent)))