导读 每当我们想简单的实现文件上传功能,而又不使用其他的语言(比如PHP、Java),或者想实现文件的断点续传。这个时候Nginx的一个模块nginx-upload-module就能满足我们的需求。
模块安装

下载模块:

cd /tmp
wget https://codeload.github.com/vkholodkov/nginx-upload-module/zip/2.2
unzip 2.2

安装模块:

.configure --add-module=/tmp/nginx-upload-module-2.2/
multipart/form-data表单上传示例

nginx.conf配置:

server {[...]location /upload {upload_pass @uploadHandler;upload_store /usr/local/nginx/upload_temp 1;upload_set_form_field $upload_field_name.path "$upload_tmp_path";}location @uploadHandler {proxy_pass http://backend-host;}[...]}

这里在server里定义了upload location,这个location是上传的接口,还有@uploadHandler location,是当文件上传完成后,nginx模块会对这个location发送一些必要的信息,如文件上传的路径,这里涉及了几个指令:

upload_pass @uploadHandler:上传完成后会发送必要的数据到@uploadHandler;
upload_store /usr/local/nginx/upload_temp 1: 文件上传的临时目录;
upload_set_form_field $upload_field_name.path “$upload_tmp_path”: 设置文件上传完成后,把文件临时路径发送给upload_pass指定的location。

断点续传示例

nginx.conf配置

server {
[...]location /resumable_upload {upload_resumable on;upload_state_store /usr/local/nginx/upload_temp ;upload_pass @drivers_upload_handler;upload_store /usr/local/nginx/upload_temp;upload_set_form_field $upload_field_name.path "$upload_tmp_path";}location @resumable_upload_handler {proxy_pass http://localhost:8002;}[...]}

与上一步multipart/form-data表单上传示例配置不同的地方有:
upload_resumable on: 开启断点续传功能;
upload_state_store /usr/local/nginx/upload_temp: 设置断点续传状态文件存储的目录。

上传文件第一个片段
POST /upload HTTP/1.1
Host: example.com
Content-Length: 51201
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="big.TXT"
X-Content-Range: bytes 0-51200/511920
Session-ID: 1111215056<0-51200的字节文件数据>
上传文件第一个片段服务器响应
HTTP/1.1 201 Created
Date: Thu, 02 Sep 2010 12:54:40 GMT
Content-Length: 14
Connection: close
Range: 0-51200/5119200-51200/511920
上传文件最后一个片段
POST /upload HTTP/1.1
Host: example.com
Content-Length: 51111
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="big.TXT"
X-Content-Range: bytes 460809-511919/511920
Session-ID: 1111215056<460809-511919字节文件数据>
上传文件最后一个片段服务器响应
HTTP/1.1 200 OK
Date: Thu, 02 Sep 2010 12:54:43 GMT
Content-Type: text/html
Connection: close
Content-Length: 2270< 响应的内容>
请求头说明
  请求头                           说明
Content-Disposition  attachment, filename=“上传的文件名”
Content-Type         待上传文件的mime type,如application/octet-stream(注:不能为multipart/form-data)
X-Content-Range      待上传文件字节范围,如第一片段bytes 0-51200/511920,最后一个片段bytes 460809-511919/511920(注:文件第一个字节标号为0,最后一个字节标号为n-1,其中n为文件字节大小)
X-Session-ID         上传文件的标识,由客户端随机指定.因为是断点续传,客户端必须确保同一个文件的所有片段上传标识一致
Content-Length       上传片段的大小
Python上传demo
#!/usr/bin/python
# -*- coding: utf-8 -*- import os.path
import requests
import hashlib# 待上传文件路径
FILE_UPLOAD = "/tmp/testfile"
# 上传接口地址
UPLOAD_URL = "http://host/drivers_upload"
# 单个片段上传的字节数
SEGMENT_SIZE = 1048576def upload(fp, file_pos, size, file_size):session_id = get_session_id()fp.seek(file_pos)payload = fp.read(size)content_range = "bytes {file_pos}-{pos_end}/{file_size}".format(file_pos=file_pos,pos_end=file_pos+size-1,file_size=file_size)headers = {'Content-Disposition': 'attachment; filename="big.TXT"','Content-Type': 'application/octet-stream','X-Content-Range':content_range,'Session-ID': session_id,'Content-Length': size}res = requests.post(UPLOAD_URL, data=payload, headers=headers)print(res.text)# 根据文件名hash获得session id
def get_session_id():m = hashlib.md5()file_name = os.path.basename(FILE_UPLOAD)m.update(file_name)return m.hexdigest()def main():file_pos = 0file_size = os.path.getsize(FILE_UPLOAD)fp = open(FILE_UPLOAD,"r")while True:if file_pos + SEGMENT_SIZE >= file_size:upload(fp, file_pos, file_size - file_pos, file_size)fp.close()breakelse:upload(fp, file_pos, SEGMENT_SIZE, file_size)file_pos = file_pos + SEGMENT_SIZEif __name__ == "__main__":main()

转载于:https://www.cnblogs.com/linux130/p/5584685.html

nginx-upload-module模块实现文件断点续传相关推荐

  1. Nginx Upload Module 上传模块

    传统站点在处理文件上传请求时,普遍使用后端编程语言处理,如:Java.PHP.Python.Ruby等.今天给大家介绍Nginx的一个模块,Upload Module上传模块,此模块的原理是先把用户上 ...

  2. JBoss Modules 模块描述文件解析

    jboss的module模块描述文件是一个XML文件,用来描述模块的结构,内容,依赖关系,过滤器,以及其它属性.它的格式是富有表现力的,用于使基于文件系统的模块装载器允许描述文件和模块内容放在一起,而 ...

  3. linux第三方模块参数,nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)...

    nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下),安装Nginx和HttpAccessKeyModule模块(参考LNMP环境 ...

  4. linux module 目录,/sys/module/ 模块信息目录与/proc/modules文件

    在内核模块编译中,会选择编译成模块,或者build in 内核镜像中,其中对内核模块有很好的的说明,这也是linux在嵌入式当中得到广泛应用的充分体现, 内核中有很多功能选项,其中有许多使我们不需要的 ...

  5. Nginx增加m3u8流视频文件功能模块 推流和拉流

    Nginx增加m3u8流视频文件功能模块 推流和拉流 FastDFS分布式文件系统安装和配置_亲测成功 ./configure --prefix=/u06/data/apps/nginx-rtmp \ ...

  6. game module 停止运行_详解流量复制解决方案--NGINX的ngx_http_mirror_module模块实现

    概述 因为我们的接口环境是在winserver上,而gor又刚好没对应版本(网上很多办法都试过了...哪位朋友测试过可以的话指点下),所以用了nginx的ngx_http_mirror_module模 ...

  7. centos 7.6——Nginx中rewrite模块应用(location)——基于域名的跳转等

    centos 7.6--Nginx中rewrite模块应用(location)--基于域名的跳转等 文章目录 centos 7.6--Nginx中rewrite模块应用(location)--基于域名 ...

  8. Nginx Rtmp Module - HLS切片和级联播放

    #Nginx Rtmp Module - HLS切片和播放 1.名词解释 媒体片段文件(.ts): 媒体片段是由源站生成的,基于编码后的媒体源,并且是由一系列的 .ts 格式的文件组成,其中包含了你想 ...

  9. 精品分享:基于 SpringBoot + Vue 开发的云盘系统(含大文件断点续传剖析)

    引言 作为开发人员,我们经常需要存储和下载文件,为了使用方便,通常都会将文件存储在云端,市面上使用率最高的云端存储莫过于百度网盘了,但使用别人的东西难免会受到各种各样的限制,必须花钱才会享受到更好的服 ...

  10. Ubuntu20.04中fastdfs,nginx的安装和配置(apt-get安装nginx添加fastdfs-nginx-module模块)

    Ubuntu20.04中fastdfs,nginx的安装和配置 环境准备: 编译环境: Ubuntu20.04 使用的系统软件: fastdfs-6.07 fastdfs-nginx-module-1 ...

最新文章

  1. 4G EPS 中的 User Plane
  2. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1051:分段函数
  3. 实用知识点梳理:BGP协议、调制解调技术、路由特点、VOIP、FTP、Cookie、滑动窗口协议与自动重传请求
  4. 通过项目逐步深入了解Mybatis(四)
  5. P2761 软件补丁问题
  6. 已知有几个数据存放在BUF为首址的字节存储区中,试统计其中正数的个数,并将结果存入ZNUM单元中。
  7. WinCE6.0的EBOOT概要
  8. 利用PUT方式上传文件的方法研究
  9. 低代码再掀炒作热潮?
  10. 「做点事」科技公司成立了!
  11. MySQL报错: Access denied for user 'root'@'localhost'
  12. ensp 双机热备 配置_华为交换机VRRP配置教程(一)
  13. Linux命令 - chmod命令
  14. 远程连接mscs下oracle,MSCS+FailSafe ORACLE数据库双机集群做HA小结
  15. 发卡行 收单行 收单
  16. ASC计算机比赛报名,新闻|2019 ASC 世界大学生超级计算机竞赛(ASC19)报名通知|信息与软件工程学院...
  17. 矩阵 通俗_。通俗诗歌
  18. 学习深度学习过程中的一些经验与方法
  19. 快速了解端口banner
  20. SAP S4 会计科目表的设计

热门文章

  1. 【原创】C++关于创建和使用静态链接库
  2. 序列化和反序列化(三)——父类的序列化
  3. Nginx系列——Windows中安装Nginx
  4. 终结者:终止线程循环的方式
  5. HTML标签margin和padding的默认属性值
  6. JS去除数组中重复的值(四种方法)
  7. 哪个oracle工具可以免费,Sqlite导入Oracle工具下载官方免费版_SqliteToOracle2.2英文版 - 系统之家...
  8. oracle创建java程序并执行
  9. (day 22 - 全排列问题 dfs+剪枝+回溯 )剑指 Offer 38. 字符串的排列
  10. (day04)剑指 Offer 10- II. 青蛙跳台阶问题