HTML5 新特性 - 基于拖拽实现文件上传

基于拖拽实现文件上传

  1. 准备一个页面, 02_upload.html. 提供一个div, 监听drop事件. 在该事件的处理函数中接收用户拖拽进来的文件信息.

  2. 一旦获取到文件信息, 需要遵守http协议规范下上传文件的标准, 发送上传文件请求, 将文件数据发给服务端.

  3. 服务端接收并存储该文件, 保存在服务器文件系统内部(/home/a.jpg)

  4. 保存完毕后, 即上传成功, 之后浏览器可以通过链接地址访问该资源.

如何获取拖拽文件的信息?

        当用户把文件拖拽到div中并触发drop事件后, 浏览器将会把拖拽的文件的基本信息, 存入event.dataTransfer. 那么意味着我们可以在drop事件处理函数中通过event.dataTransfer获取拖拽的文件基本信息:

let files = event.dataTransfer.files

文件上传流程与协议规范

        文件上传流程:

  1. 客户端选择需要上传的文件, 点击上传, 开始建立连接, 准备上传.

  2. 服务端接收连接请求,完成连接的建立, 接收上传的文件(遵守协议).

  3. 服务端将接收到的文件数据,存入服务器文件系统(D:/xxx.mp3).

  4. 保存完毕后即上传成功, 之后浏览器可以根据某个链接地址访问资源.

        协议规范:

  1. 要求客户端提交文件的请求方式必须是POST.

  2. 发请求时必须携带请求消息头:Content-Type: multipart/form-data.

  3. 客户端将本地文件在请求body部分中以数据流的方式传输给服务端.

  4. 服务端接收客户端传来的数据流, 边接收, 边保存到服务端磁盘中.

客户端发送上传文件请求

客户端发送上传文件请求时的方式有两种:

  1. 基于表单发送上传文件请求.

  2. 基于ajax发送上传文件请求.

基于表单发送上传文件请求实现文件上传时, 需要注意一下协议规则:

  1. 必须整理表单.<form> </form>

  2. 表单提交方式必须是post.

  3. 设置表单的属性:

<form action="/upload"
      method="post"
      enctype="multipart/form-data">
    <input type="file" name="uploadFile">
    <input type="submit" value="提交">
</form>

        基于ajax发送上传文件请求优点就是异步发送请求, 上传文件的基本写法如下: (在此引入axios, 使用axios发送ajax请求):

// 封装表单参数,  html5提供了 FormData 用于封装表单参数
let formdata = new FormData();
formdata.append('name', 'zhangsan')   //  name=zhangsan
formdata.append('age', 17) // name=zhangsan&age=17
formdata.append('uploadFile', filelist[0])
//  name=zhangsan&age=17&uploadFile=FileObj
axios.post('http://localhost:3000/upload', formdata)

        为什么页面刷新了?

        使用ajax发送上传文件请求, 若该上传文件请求为跨域请求, 则浏览器接收到响应之后将会自动刷新页面. 若不希望页面自动刷新, 可以控制避免该请求为跨域请求.

如何访问已经上传的资源?

        最基础的方法:

  1. 服务端将upload目录设置为静态托管目录.

  2. 客户端可以直接发请求, 访问upload目录下的资源:

    http://localhost:3000/1b8a8371-2afd-4355-99e3-e8a23711514f.jpg

        进阶版:

  1. 客户端上传的文件将会交给一个专业的静态资源服务器. 该静态资源服务器将会返回一个访问链接.

  2. 客户端下次直接访问该链接即可获取静态资源服务器中的资源.

以上传头像为例:

  1. 在服务端mysql数据库中存储用户的基本信息.

    ID    name    age      avatar

              zs         13     1234.jpg2

              ls          15      2345.jpg

  2. 客户端登录成功后, 选择新头像, 执行上传业务.

  3. 服务端通过multer中间件将上传上来的文件重命名, 保存到头像目录中.

  4. 保存成功后, 需要将新的头像文件名更新到数据库:

    ID     name    age    avatar

     1         zs     13      abaab-865a-s95d-fa9s.jpg

     2         ls      15      2345.jpg

  5. zs再次登录时, 就可以直接获取到数据库中存储的最新的头像路径, 在页面中显示即可.

服务端到底怎么保存的上传上来的文件?

        基于multer中间件实现文件的接收与保存.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,uni-file-picker 是一款适用于 uni-app 的文件选择器组件,可以方便地进行文件上传操作,同时也支持拖拽上传的功能。 首先在页面中引入 uni-file-picker 组件: ```html <template> <view> <uni-file-picker @select="onSelect" @success="onSuccess" @fail="onFail" /> </view> </template> <script> import uniFilePicker from '@/components/uni-file-picker/uni-file-picker.vue' export default { components: { uniFilePicker }, methods: { onSelect(files) { console.log('选择了文件', files) }, onSuccess(res) { console.log('上传成功', res) }, onFail(err) { console.log('上传失败', err) } } } </script> ``` 在选择文件后,会触发 `select` 事件,返回一个文件列表,我们可以通过遍历列表来查看用户选择的文件。接着,当文件上传成功时,会触发 `success` 事件,返回上传的结果,当上传失败时,会触发 `fail` 事件,返回错误信息。 为了实现拖拽上传的功能,我们还需要在 `uni-file-picker` 组件中增加一些代码: ```html <template> <view class="uni-file-picker"> <view class="uni-file-picker__drop-area" @drop="onDrop" @dragover.prevent> <view class="uni-file-picker__icon"> <uni-icons type="add" size="32" color="#999"></uni-icons> </view> <view class="uni-file-picker__text">将文件拖到此区域上传</view> </view> <view class="uni-file-picker__button"> <button type="primary" @click="onChoose">选择文件</button> </view> <input class="uni-file-picker__input" ref="input" type="file" multiple @change="onChange" /> </view> </template> <script> export default { methods: { onDrop(e) { e.preventDefault() const files = e.dataTransfer.files this.$emit('select', files) }, onChoose() { this.$refs.input.click() }, onChange(e) { const files = e.target.files this.$emit('select', files) } } } </script> ``` 我们在 `uni-file-picker__drop-area` 上绑定了 `drop` 和 `dragover` 事件,分别用于监听文件拖拽和悬停操作,当用户将文件拖拽到该区域时,会触发 `drop` 事件,我们可以通过 `dataTransfer` 属性获取到用户拖拽的文件列表,然后再通过 `$emit` 方法将文件列表传递出去。 需要注意的是,在拖拽操作中,浏览器会默认打开文件,因此需要在 `dragover` 事件中调用 `preventDefault` 方法阻止默认行为,避免浏览器打开文件。 最后,在 `uni-file-picker__button` 中添加一个按钮,用于触发文件选择操作,然后在 `uni-file-picker__input` 中绑定 `change` 事件,用于监听文件选择操作。 以上就是实现 uni-file-picker 文件上传并且实现拖拽的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值