首页 > 系统相关 >使用 Nginx Upload Module 实现上传文件功能

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

时间:2023-06-04 18:33:05浏览次数:62  
标签:name field Upload Module upload Nginx file path



普通网站在实现文件上传功能的时候,一般是使用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

标签:name,field,Upload,Module,upload,Nginx,file,path
From: https://blog.51cto.com/u_2700990/6411663

相关文章

  • 解决报错:fatal: in unpopulated submodule *(WSG实测,可以解决问题)
    问题今天想把两个Git工程合并成一个工程,尽管已经将其中一个工程的.git目录删除了,但是在合并提交时还是遇到了一个和子模块相关的报错,具体报错信息如下:fatal:inunpopulatedsubmodule'*'报错截图如下:解决通过报错截图的信息,我们可以知道是在执行添加目录时发生......
  • nginx开启更为安全的tls1.3
    随着互联网安全越来越受到重视,越来越多的网站选择启用https来保证数据的加密传输,TLS1.2发布于2008年8月,至今正好有10年,所以新协议TLS1.3呼之欲出。Googlechrome在最近的版本更新中也开始逐步对TLS1.3进行支持,TLS1.3对于TLS1.2有重大改写,提高了安全性并且提高了速度,所以升级还是很......
  • django 自定义FileField upload_to上传路径
    defuser_directory_path(instance,name):"""clean_data内容:fork,vinclean_data:K:fileV:record1301DL00220230602全部.txtK:nameV:record1301DL00220230602全部.txt"""filename=name[15:2......
  • 安装 Nginx 修改默认端口
    用远程工具连接我们上次购买的机器,这里我要介绍一个知识点,博主使用的工具是MobaXterm,这个工具有一个多操作的功能,在下图的位置可以开启多操作,然后连接你的服务器机子即可:首先我们将机子里面的依赖源都更新一下,在去安装Nginx,在控制台输入如下命令进行更新:apt-getupdate安装Nginx......
  • upload-labs 1到21题通关详解
    第一题直接查看源码functioncheckFile(){varfile=document.getElementsByName('upload_file')[0].value;if(file==null||file==""){alert("请选择要上传的文件!");returnfalse;}//定义允许上传的文件类型varal......
  • winows 下iis+nginx +php 部署
    我们服务器使用的server2008,由于iis里还有asp.net网站,php就想用iis做代理转发到nginx来处理请求。第一步:我为了省事,直接安装的phpstudy 下载地址:https://www.xp.cn/第二步:安装好后,设置运行fast-cgi,可以使用以下命令做bat,指定端口运行fast-cgi,我指定端口为9003ECHOSt......
  • 使用openresty替换线上nginx网关之openresty安装细节
    背景线上跑了多年的一个网关业务,随着部门的拆分,逐渐有了一个痛点。该网关业务主要处理app端请求,app端发起的请求,采用http协议,post方法,content-type采用application/x-www-form-urlencoded,表单中有一个固定的字段,叫功能号,即funcNo=1000100这样,然后表单中其他业务字段就根据funcNo......
  • git仓库支持submodule
    概述git仓库引用其他仓库,类似软连接//usedgitsubmoduleaddgit://github.com/[USERNAME]/[REPO_NAME].gitTARGET_FOLDER在主仓库创建为TARGET_FOLDER的文件夹这会克隆一个外部仓库:git://github.com/[USERNAME]/[REPO_NAME].git到TARGET_FOLDER,类似gitclone这同时......
  • Nginx日志
    nginx.conf中有关访客日志定义如下#log_format#创建日志格式,名为mainlog_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x......
  • fastDFS + nginx安装
    一、环境centos7.6二、下载安装包1、下载fastdfscd/usr/local/srcwgethttps://github.com/happyfish100/fastdfs/archive/refs/tags/V6.07.tar.gz-Ofastdfs-6.07.tar.gz2、下载libfastcommonwget-Olibfastcommon-1.0.53.tar.gzhttps://github.com/happyfis......