[关闭]
@zhouyy 2018-03-16T06:54:28.000000Z 字数 3589 阅读 771

nginx upload

backend


相关链接:
https://www.cnblogs.com/1995hxt/p/6107871.html
http://www.grid.net.ru/nginx/upload.en.html#upload_store
http://blog.csdn.net/daa20/article/details/75084282

普通网站在实现文件上传功能的时候,一般是使用Python,Java等后端程序实现,比较麻烦。Nginx有一个Upload模块,可以非常简单的实现文件上传功能。此模块的原理是先把用户上传的文件保存到临时文件,然后在交由后台页面处理,并且把文件的原名,上传后的名称,文件类型,文件大小set到页面。下面和大家具体介绍一下。

一、编译安装Upload Module

  1. cd /tmp
  2. wget https://codeload.github.com/vkholodkov/nginx-upload-module/
  3. //yum install -y unzip zip
  4. zip/2.2
  5. unzip 2.2
  6. //进入到nginx源码所在的文件夹,就是我刚才的nginx解压后的文件夹,/tmp/nginx-1.7.8 执行下面两条指令:
  7. ./configure --add-module=/root/tmp/nginx-upload-module-2.2
  8. make //注意,如果是添加模块,只需要make,不要执行make install 否则会覆盖安装。

二、Nginx配置

Nginx upload module的简单配置如下:

  1. server {
  2. listen *:80 default_server;
  3. server_name 192.168.1.251;
  4. client_max_body_size 20m;
  5. client_body_buffer_size 512k;
  6. proxy_set_header Host $host;
  7. proxy_set_header X-Real-IP $remote_addr;
  8. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9. proxy_set_header REMOTE_ADD $remote_addr;
  10. location /upload {
  11. # 转到后台处理URL,表示Nginx接收完上传的文件后,然后交给后端处理的地址
  12. upload_pass @python;
  13. # 临时保存路径, 可以使用散列
  14. # 上传模块接收到的文件临时存放的路径, 1 表示方式,该方式是需要在/tmp/nginx_upload下创建以0到9为目录名称的目录,上传时候会进行一个散列处理。
  15. upload_store /tmp/nginx_upload;
  16. # 上传文件的权限,rw表示读写 r只读
  17. upload_store_access user:rw group:rw all:rw;
  18. set $upload_field_name "file";
  19. # upload_resumable on;
  20. # 这里写入http报头,pass到后台页面后能获取这里set的报头字段
  21. upload_set_form_field "${upload_field_name}_name" $upload_file_name;
  22. upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;
  23. upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;
  24. # Upload模块自动生成的一些信息,如文件大小与文件md5值
  25. upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;
  26. upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;
  27. # 允许的字段,允许全部可以 "^.*$"
  28. upload_pass_form_field "^.*$";
  29. # upload_pass_form_field "^submit$|^description$";
  30. # 每秒字节速度控制,0表示不受控制,默认0, 128K
  31. upload_limit_rate 0;
  32. # 如果pass页面是以下状态码,就删除此次上传的临时文件
  33. upload_cleanup 400 404 499 500-505;
  34. # 打开开关,意思就是把前端脚本请求的参数会传给后端的脚本语言,比如:http://192.168.1.251:9000/upload/?k=23,后台可以通过POST['k']来访问。
  35. upload_pass_args on;
  36. }
  37. location @python {
  38. proxy_pass http://localhost:9999;
  39. # return 200; # 如果不需要后端程序处理,直接返回200即可
  40. }
  41. }

三、后端处理程序

这里我们使用Django作为后端处理程序,比较简单,具体如下:

首先创建Django项目:

django-admin.py startproject uploadmodule
然后,创建views.py文件,代码如下:

  1. # -*- coding: utf-8 -*-
  2. import os
  3. import json
  4. from django.http import HttpResponse
  5. from django.views.decorators.csrf import csrf_exempt
  6. UPLOAD_FILE_PATH = '/tmp/nginx_upload/'
  7. @csrf_exempt
  8. def upload(request):
  9. request_params = request.POST
  10. file_name = request_params['file_name']
  11. file_content_type = request_params['file_content_type']
  12. file_md5 = request_params['file_md5']
  13. file_path = request_params['file_path']
  14. file_size = request_params['file_size']
  15. ip_address = request.META.get('HTTP_X_REAL_IP') or request.META.get('HTTP_REMOTE_ADD')
  16. # save file to tmp
  17. new_file_name = '%s_%s' % (file_md5, ip_address)
  18. new_file_path = ''.join([UPLOAD_FILE_PATH, new_file_name, os.path.splitext(file_name)[-1]])
  19. with open(new_file_path, 'a') as new_file:
  20. with open(file_path, 'rb') as f:
  21. new_file.write(f.read())
  22. content = json.dumps({
  23. 'name': file_name,
  24. 'content_type': file_content_type,
  25. 'md5': file_md5,
  26. 'path': file_path,
  27. 'size': file_size,
  28. 'ip': ip_address,
  29. })
  30. response = HttpResponse(content, content_type='application/json; charset=utf-8')
  31. return response

四、示例

上面的代码完成之后,我们通过下面的命令启动Django后端程序:

  1. cd uploadmodule/
  2. python manage.py runserver 0.0.0.0:9999

然后,模拟POST请求:http://192.168.1.251/upload/,上传一个jpg文件,返回结果如下:

  1. {
  2. "name": "6125444419718417450.jpg",
  3. "ip": "192.168.1.121",
  4. "content_type": "image/jpeg",
  5. "path": "/tmp/nginx_upload/0000000002",
  6. "md5": "c3b1bd2e72694a8d5fc4548b9ecd9e18",
  7. "size": "37980"
  8. }

参考:

Ubuntu 14.10下源码编译安装Nginx 1.8.0

HttpUploadModule - Nginx Community

vkholodkov/nginx-upload-module at 2.2

Uploading to nginx using the nginx upload module with php_handler

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注