Upload 学习笔记

Upload 学习笔记

一、基础

<form id="upload" enctype="multipart/form-data" method="post"> 
	<input type="file"  multiple="multiple" id="files" 
		onChange={(event)=>{
			//这个files就是获取的file文件的一个数组。之后你可以使用任何方式来操作它。
			console.log(event.target.files);
		}}
	/>
</form> 

1. multiple=“multiple” 可接受多个值的文件上传字段

input[type=“file”]可以实现上传多个文件,只需要给添加multiple="multiple"属性便实现同时上传多个文件效果。

2. accept=“application/x-msdownload,video/*”

input[type=“file”]可以实现限定上传的文件类型,只需要给添加 accept=“video/*”(限定只上传视频文件)属性。

可以通过accept规定上传的文件类型,可以定义多个文件类型,用逗号隔开。

3.解析获取input[type=“file”]的文件数据

如果你想要选中文件就自动提交可以给input[type=“file”]onchange的改变事件,当你选择完文件就会执行该事件。
input[type=“file”]数据解析
从输出的数据分析就知道获取的数据是一个数组,可以根据length获取上传的某个文件的信息

 let f=document.getElementById("files");
	console.log(f.files);
	//转换文件为URL访问资源,或者用下文 FileReader.result
	const windowURL = window.URL || window.webkitURL;
    const dataURL = windowURL.createObjectURL(fileObj);

4.如何与后台交互数据

可以通过form表单提交,但注意要给form表单添加两个属性
1.method=“post” 要用post提交。
2. enctype=“multipart/form-data” 要修改请求参数的格式

可以通过由表单构造的FormData对象,将需要请求参数以键值对的形式添加到FormData构造函数,由FormData构造函数传递数据给后台

 let form = document.getElementById('upload'), 
 let formData = new FormData(form); 
 
//          (传输属性名,传输对应数据)
formdata.append('name',data); 

二、Antd Upload

import { Upload, message } from 'antd';
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';

function getBase64(img, callback) {
	
  const reader = new FileReader();
  //事件处理,监听load触发时执行callback,即给state设置imageUrl
  /*<img src="https://img-blog.csdnimg.cn/2022010619273051994.jpeg" alt="avatar" style="width: 100%;">
  */
  reader.addEventListener('load', () => callback(reader.result));
  //触发 load 事件,当读取操作完成的时候,readyState 会变成已完成DONE,并触发 loadend 事件
  reader.readAsDataURL(img);
}

//对上传文件类型检查和大小检查
function beforeUpload(file) {
  const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
  if (!isJpgOrPng) {
    message.error('You can only upload JPG/PNG file!');
  }
  const isLt2M = file.size / 1024 / 1024 < 2;
  if (!isLt2M) {
    message.error('Image must smaller than 2MB!');
  }
  return isJpgOrPng && isLt2M;
}

class Avatar extends React.Component {
  state = {
    loading: false,
  };

  handleChange = info => {
    if (info.file.status === 'uploading') {
      this.setState({ loading: true });
      return;
    }
    if (info.file.status === 'done') {
      // Get this url from response in real world.
      getBase64(info.file.originFileObj, imageUrl =>
        this.setState({
          imageUrl,
          loading: false,
        }),
      );
    }
  };

  render() {
    const uploadButton = (
      <div>
        {this.state.loading ? <LoadingOutlined /> : <PlusOutlined />}
        <div className="ant-upload-text">Upload</div>
      </div>
    );
    const { imageUrl } = this.state;
    return (
      <Upload
      	//传输属性名,默认已post传输
        name="avatar"
        listType="picture-card"
        className="avatar-uploader"
        showUploadList={false}
        //服务器接口
        action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
        //上传文件之前的钩子,参数为上传的文件,若返回 false 则停止上传。
        //支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传,resolve 时开始上传
        //( resolve 传入 File 或 Blob 对象则上传 resolve 传入对象)。
        //注意:IE9 不支持该方法。
        beforeUpload={beforeUpload}
        //上传中、完成、失败都会调用这个函数。
        onChange={this.handleChange}
      >
        {imageUrl ? <img src={imageUrl} alt="avatar" style={{ width: '100%' }} /> : uploadButton}
      </Upload>
    );
  }
}

ReactDOM.render(<Avatar />, mountNode);

1.FileReader

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

其中File对象可以是来自用户在一个元素上选择文件后返回的FileList对象,也可以来自拖放操作生成的 DataTransfer对象,还可以是来自在一个HTMLCanvasElement上执行mozGetAsFile()方法后返回结果。

重要提示: FileReader仅用于以安全的方式从用户(远程)系统读取文件内容 它不能用于从文件系统中按路径名简单地读取文件。 要在JavaScript中按路径名读取文件,应使用标准Ajax解决方案进行服务器端文件读取,如果读取跨域,则使用CORS权限。

1) 属性
FileReader.error 只读

一个DOMException,表示在读取文件时发生的错误 。

FileReader.readyState 只读

表示FileReader状态的数字。取值如下:

常量名描述
EMPTY0还没有加载任何数据.
LOADING1数据正在被加载.
DONE2已完成全部的读取请求.
FileReader.result 只读

文件的内容。该属性仅在读取操作完成后才有效,数据的格式取决于使用哪个方法来启动读取操作。

2)事件处理
FileReader.onabort

处理abort事件。该事件在读取操作被中断时触发。

FileReader.onerror

处理error事件。该事件在读取操作发生错误时触发。

FileReader.onload

处理load事件。该事件在读取操作完成时触发。

FileReader.onloadstart

处理loadstart事件。该事件在读取操作开始时触发。

FileReader.onloadend

处理loadend事件。该事件在读取操作结束时(要么成功,要么失败)触发。

FileReader.onprogress

处理progress事件。该事件在读取Blob时触发。

3)方法
FileReader.abort()

中止读取操作。在返回时,readyState属性为DONE。

FileReader.readAsArrayBuffer()

开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.

FileReader.readAsBinaryString()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。

FileReader.readAsDataURL()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容。

FileReader.readAsText()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值