文件上传服务.ym 9 KB |
||
目录文件上传服务基于 tus.io 协议构建。 1 API 说明与约定
2 在wo获取上传凭证在使用 tus.io 协议上传文件之前,需要先通过调用站点内容管理的 /api/v1/content/get_upload_signcode 接口,从文档系统拿到上传凭证。 上传凭证中的以下字段不需要传递给上传服务器:
3 在uplaod服务创建上传会话 /api/v1/upload/upload_resumable向此地址发送 HTTP POST 请求可以创建一个上传会话。 参数分为两部分:
会话成功创建后会返回一个 HTTP 201 响应,响应头中的 Location 字段值就是会话地址。 4 查询文件上传进度在会话创建之后、文件上传完毕之前,可以向会话地址发起 HTTP HEAD 请求来查询文件的上传进度。 一旦文件上传完毕,或者在会话过期前没有开始上传文件内容,会话自动失效,查询将会返回 HTTP 404 错误。 参数:
在响应头中的 Upload-Offset 字段值即为文件的上传进度,以字节计。 5 上传文件内容创建会话后,向会话地址发起 HTTP PATCH 请求可以上传文件内容。 参数:
响应:
6 使用 edo_client 来进行断点上传edo_client 对于使用 Python 语言来上传文件的过程做了简化,并支持回调函数,可以用于显示进度等。 上传之前,需要先从工作站点拿到签名许可: upload_sign = wo_client.content.get_upload_signcode( expire=signcode_expiration, maxsize=2**20, uid=folder_uid, filename = filename, ) 上传本地文件: def progress_callback(offset, file_size, filepath=None): print '{:.1f}%'.format(100.0 * offset / file_size) metadata = upload_client.upload.upload( local_file_path, upload_sign, store=None, on_progress=progress_callback, chunk_size=2**20 ) 其中 on_progress 是一个接受 3 个参数的回调函数,文件每上传完一块(块大小由 chunk_size 参数指定)都会被调用一次。调用时参数为:
如果文件在上传过程中被修改(mtime 发生变化),上传会中断,并抛出 AbortUpload(419, 419, '上传期间文件被修改') 错误。 文件的上传会话信息保存在 store 参数指定的目录中,默认是 ~/.edo/upload_progress。 如果需要,也可以直接按以下方式调用底层接口来完成上传: 先创建一个会话: session_url = upload_client.upload.create_session( size=filesize, parent_rev=None, **upload_sign ) 保存这个session_url,之后可以断点续传。先看看文件先前上传了多少: offset = upload_client.upload.get_offset(session_url) 然后连续分片上传: while offset is not None: resp = upload_client.upload.put_chunk( session_url, f, offset, chunk_size=2*2**20 ) offset = resp.get('offset') rate = offset * 100.0 / filesize if offset else 100 print '[%-100s] %%%.2f\r' % ('='*int(rate), rate), |