组件化开发
上传图片组件
上传文件的两种实现方式
- 一种是使用 传统的 form submission,表单提交的方式
- 第二种是使用 Javascript 发送异步请求的方式
传统表单模式
- form method设置为post
- enctype=”multipart/form-data” : multipart/form-data表示提交的文件以二进制传输
- action为后端接受上传文件的接口
- input框的type设置为file, 此时界面的输入框为上传文件的选择,点击后就会弹出文件夹进行选择
- 点击button时就会触发向action地址发送请求
1 2 3 4
| <form method="post" encType="multipart/form-data" action="https://jsonplaceholder.typicode.com/posts"> <input type="file" /> <button type="submit">Submit</button> </form>
|
js发送异步请求的方式
- 当点击上传文件后就会触发input的change事件回调函数
- 在回调函数中通过target可以拿到上传的文件
- 文件可以上传多个所以是以类似数组的形式存储的 若只上传一个文件 则通过
files[0]
拿到数组第一个元素即为上传的文件
- 通过
uploadedFile.name
可以拿到文件名
- 通过
new FormData()
创建编码二进制的对象
formData.append(uploadedFile.name, uploadedFile)
函数将要编码的文件进行编码
- 第一个参数为:要编码的文件名
- 第二个参数为: 要编码的文件
- 发送post请求时加上header:
'Content-Type': 'multipart/form-data'
, 声明传输的数据是二进制的
1
| <input type="file" @change="handleFileChange"/>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const handleFileChange = (e: Event) => { const target = e.target as HTMLInputElement const files = target.files if (files) { const uploadedFile = files[0] const formData = new FormData() formData.append(uploadedFile.name, uploadedFile) axios.post("/upload", formData , { headers: { 'Content-Type': 'multipart/form-data' } }).then(resp => { console.log(resp) }) } }
|
组件开发
需求:<input type="file" @change="handleFileChange"/>
原本的样式是类似一个按钮,点击就可以触发选择文件,但是组件的需求可能是点击某个区域或自定义样式的组件触发文件的选择
解决方案:通过display: none
隐藏inout框,然后通过点击自定义样式的标签触发事件,在事件处理过程中通过js拿到input标签并触发它的点击事件,从而触发文件的选择