`
hongtoushizi
  • 浏览: 380812 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

使用 Nginx Upload Module 实现上传文件功能

阅读更多

转载自: http://www.tuicool.com/wx/aUrAzm

 

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

一、编译安装Nginx

为了使用Nginx Upload Module,需要编译安装Nginx,将upload module编译进去。upload module的代码可以去Github上下载: Upload Module

之后的编译安装Nginx这里就不介绍,不了解的可以参考: Ubuntu 14.10下源码编译安装Nginx 1.8.0

二、Nginx配置

Nginx upload module的简单配置如下:

server {

    listen *:80 default_server;

    server_name 192.168.1.251;

    client_max_body_size 20m;

    client_body_buffer_size 512k;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_set_header REMOTE_ADD $remote_addr;

    location /upload {

# 转到后台处理URL,表示Nginx接收完上传的文件后,然后交给后端处理的地址

upload_pass @python;

# 临时保存路径, 可以使用散列

# 上传模块接收到的文件临时存放的路径, 1 表示方式,该方式是需要在/tmp/nginx_upload下创建以0到9为目录名称的目录,上传时候会进行一个散列处理。

upload_store /tmp/nginx_upload;

# 上传文件的权限,rw表示读写 r只读

upload_store_access user:rw group:rw all:rw;

set $upload_field_name "file";

# upload_resumable on;

# 这里写入http报头,pass到后台页面后能获取这里set的报头字段

upload_set_form_field "${upload_field_name}_name" $upload_file_name;

upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;

upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;

# Upload模块自动生成的一些信息,如文件大小与文件md5值

upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;

upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;

# 允许的字段,允许全部可以 "^.*$"

upload_pass_form_field "^.*$";

# upload_pass_form_field "^submit$|^description$";

# 每秒字节速度控制,0表示不受控制,默认0, 128K

upload_limit_rate 0;

# 如果pass页面是以下状态码,就删除此次上传的临时文件

upload_cleanup 400 404 499 500-505;

# 打开开关,意思就是把前端脚本请求的参数会传给后端的脚本语言,比如:http://192.168.1.251:9000/upload/?k=23,后台可以通过POST['k']来访问。

upload_pass_args on;  

    }

    location @python {

proxy_pass http://localhost:9999;

# return 200;  # 如果不需要后端程序处理,直接返回200即可

    }

}

三、后端处理程序

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

首先创建Django项目:

django-admin.py startproject uploadmodule

然后,创建views.py文件,代码如下:

# -*- coding: utf-8 -*-

import os

import json

from django.http import HttpResponse

from django.views.decorators.csrf import csrf_exempt

UPLOAD_FILE_PATH = '/tmp/nginx_upload/'

@csrf_exempt

def upload(request):

request_params = request.POST

file_name = request_params['file_name']

file_content_type = request_params['file_content_type']

file_md5 = request_params['file_md5']

file_path = request_params['file_path']

file_size = request_params['file_size']

ip_address = request.META.get('HTTP_X_REAL_IP') or request.META.get('HTTP_REMOTE_ADD')

# save file to tmp

new_file_name = '%s_%s' % (file_md5, ip_address)

new_file_path = ''.join([UPLOAD_FILE_PATH, new_file_name, os.path.splitext(file_name)[-1]])

with open(new_file_path, 'a') as new_file:

with open(file_path, 'rb') as f:

new_file.write(f.read())

content = json.dumps({

'name': file_name,

'content_type': file_content_type,

'md5': file_md5,

'path': file_path,

'size': file_size,

'ip': ip_address,

})

response = HttpResponse(content, content_type='application/json; charset=utf-8')

return response

四、示例

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

cd uploadmodule/

python manage.py runserver 0.0.0.0:9999

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

{

"name": "6125444419718417450.jpg",

"ip": "192.168.1.121",

"content_type": "image/jpeg",

"path": "/tmp/nginx_upload/0000000002",

"md5": "c3b1bd2e72694a8d5fc4548b9ecd9e18",

"size": "37980"

}

参考:

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

分享到:
评论

相关推荐

    nginx_upload_module 加lua 实现上传

    通过这样的配置,我们可以实现一个完整的文件上传解决方案,既利用了`nginx_upload_module`的强大上传功能,又借助Lua实现了灵活的业务逻辑处理。这种方式不仅可以提高上传效率,还能有效控制服务器资源,确保系统的...

    nginx-upload-module-master.rar_modules_nginx_upload

    Nginx Upload Module 是一款为 Nginx Web 服务器设计的扩展模块,主要用于处理文件上传功能。它提供了高效、灵活且可靠的文件上传解决方案,支持大文件分块上传以及断点续传,是许多 web 应用程序在后端处理用户上传...

    Nginx+upload+lua实现简单文件上传服务

    本教程将详细解析如何使用Nginx、upload模块以及lua来搭建一个简单的文件上传系统。 首先,我们需要了解Nginx的ngx_http_upload_module模块,这是一个用于处理HTTP POST请求中的文件上传的第三方模块。它允许我们在...

    nginx上传下载之nginx-upload-module-2.3.0

    **Nginx Upload Module 2.3.0 ...总之,Nginx Upload Module 2.3.0 提供了一种有效的方式来管理和处理大文件上传,为开发者提供了更多的灵活性和控制力。正确配置和使用这个模块,能够极大地提升 Web 应用的用户体验。

    nginx-upload-module模块源码

    nginx-upload-module模块源码,用于nginx配置文件上传功能

    包含upload-module的nginx-1.21.6的windows平台64位的二进制文件

    包含upload-module的nginx-1.21.6,针对windows平台64位的编译的二进制(exe)文件。 为了upload-module能在window平台编译通过,进行部分代码修改,修改内容详见https://github.com/chnykn/bimface

    nginx_upload_module-2.2.0.tar.gz

    Nginx Upload Module 是由 Michael Noll 开发的一个模块,它允许用户在 Nginx 中实现文件上传,包括临时存储上传文件、将文件移动到指定位置、支持断点续传以及验证文件大小和类型等。该模块通常与后端的动态语言如 ...

    nginx-upload-module-2.2.

    然而,原生的Nginx并不支持大文件的上传功能,为了实现这个需求,开发者们开发了Nginx Upload Module。本文将详细阐述Nginx Upload Module 2.2的相关知识点,帮助你更好地理解和应用这个模块。 ### 1. Nginx Upload...

    Nginx文件上传模块配置

    在本文中,我们将深入探讨如何配置Nginx以支持文件上传功能,特别是使用upload_module和upload_progress_module这两个第三方模块。Nginx是一个高效且灵活的HTTP服务器和反向代理,由Igor Sysoev开发,它支持模块化的...

    nginx-upload-module-2.0.tar.gz

    Nginx是一个高性能的HTTP...总之,`nginx-upload-module`是一个强大的工具,它增强了Nginx处理文件上传的能力,但需要注意与不同Nginx版本的兼容性问题。通过正确配置和定制,你可以构建一个高效且安全的文件上传系统。

    nginx1.16.1+nginx-upload-module-2.3.0.zip

    总的来说,"nginx1.16.1+nginx-upload-module-2.3.0.zip" 提供了一种实现大文件上传的解决方案,结合了 Nginx 的稳定性和 nginx-upload-module 的便捷性,使得在 Web 应用中处理文件上传变得更加高效和可控。...

    nginx-upload-module-master.zip

    为了解决这个问题,社区开发了第三方模块——Nginx Upload Module,它允许用户在Nginx服务器上便捷地实现文件上传功能。 **一、Nginx Upload Module 概述** Nginx Upload Module 是一个Nginx插件,主要功能是接收...

    断点上传Nginx升级后的组件nginx-upload-module-2.2

    总之,`nginx-upload-module-2.2`是一个强大的工具,能够增强Nginx的文件上传功能,尤其对于需要断点续传的场景。通过正确配置和集成,你可以创建一个高效、安全的文件上传服务。在实际操作中,务必注意安全性和稳定...

    nginx1.16+nginx-upstream-check-module-master+nginx-upload-module

    此外,`nginx-upload-module`还能与后端应用程序集成,例如通过POST请求将上传信息传递给PHP、Java等后端服务,实现文件的存储和处理。 在实际部署中,这三个组件通常一起使用,构建一个具备健康检查和文件上传功能...

    nginx-upload-progress模块源码

    总之,`nginx-upload-progress` 模块为 Nginx 增添了强大的文件上传进度追踪功能,极大地提升了用户体验。理解其源码有助于定制化开发或优化现有功能,满足特定场景下的需求。对于运维人员来说,熟练掌握这一模块的...

    nginx_uploadprogress_module-0.9.0

    该模块专门用于在Nginx服务器端实现文件上传的实时进度跟踪,让用户在上传过程中能够看到清晰的进度条,从而减轻用户对长时间等待的焦虑感。 1. **Nginx与UploadProgress Module** Nginx是一款高性能的HTTP和反向...

    nginx-upload-module安装依赖包

    nginx-upload-module安装依赖包,包括了 ngx_cache_purge-2.3.tar.gz,zlib-1.2.11.tar.gz,pcre2-10.32.tar.gz,nginx-upload-module-2.2.zip

    nginx-upload-progress-module.zip

    nginx-upload-progress-module 是 Nginx 的文件上传时支持进度显示的扩展模块。 标签:nginx

    nginx-upload 上传工具的javaweb请求处理服务

    nginx-upload 上传工具的javaweb请求处理服务

    nginx-upload-module

    Nginx上传模块该模块基于Nginx上传模块(v 2.2.0) 。 ...由于似乎作者没有维护该模块。 我更改了一些可以与最新的nginx一起安装的代码。 安装./configure --add-module = {module_dir} && make &&进行安装conf ...

Global site tag (gtag.js) - Google Analytics