搭建:基于nginx的上传功能

搭建:基于nginx的上传功能

文章目录

  • 搭建:基于nginx的上传功能
    • 一、准备
    • 二、安装nginx
      • 1.1 解压nginx和nginx插件
      • 1.2 编译并安装nginx
    • 三、启动一个python后台服务,用于上传到临时路径文件,转移到正式路径
    • 四、添加nginx配置
      • (1)配置一个静态文件服务
      • (2)配置上传文件服务
    • 五、启动nginx和python服务
    • 六、python程序测试上传

一、准备

开发一个基于nginx的上传功能。

  • 下载nginx:https://nginx.org/en/download.html

    nginx-1.18.0.tar.gz

  • 下载nginx-upload-module插件:https://github.com/vkholodkov/nginx-upload-module/tags

    nginx-upload-module-2.3.0.tar.gz

二、安装nginx

1.1 解压nginx和nginx插件

先解压nginx-1.18.0.tar.gz, 然后将nginx-upload-module-2.3.0.tar.gz解压到nginx-1.18.0目录下。

[root@VM-4-3-centos nginx-1.18.0]# ll
总用量 788
drwxr-xr-x 6 1001 1001   4096 8月  19 09:52 auto
-rw-r--r-- 1 1001 1001 302863 4月  21 2020 CHANGES
-rw-r--r-- 1 1001 1001 462213 4月  21 2020 CHANGES.ru
drwxr-xr-x 2 1001 1001   4096 8月  19 09:52 conf
-rwxr-xr-x 1 1001 1001   2502 4月  21 2020 configure
drwxr-xr-x 4 1001 1001   4096 8月  19 09:52 contrib
drwxr-xr-x 2 1001 1001   4096 8月  19 09:52 html
-rw-r--r-- 1 1001 1001   1397 4月  21 2020 LICENSE
drwxr-xr-x 2 1001 1001   4096 8月  19 09:52 man
drwxrwxr-x 3 root root   4096 8月   2 2018 nginx-upload-module-2.3.0
-rw-r--r-- 1 1001 1001     49 4月  21 2020 README
drwxr-xr-x 9 1001 1001   4096 8月  19 09:52 src
[root@VM-4-3-centos nginx-1.18.0]#

1.2 编译并安装nginx

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

安装PCRE,让nginx支持Rewrite功能:

  • 下载pcre :http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gzhttp://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
[root@VM-4-3-centos servers]# cd pcre-8.35/
[root@VM-4-3-centos pcre-8.35]# ./configure
[root@VM-4-3-centos pcre-8.35]# make && make install
......
[root@VM-4-3-centos pcre-8.35]# pcre-config --version
8.35
[root@VM-4-3-centos pcre-8.35]#

编译并安装nginx

mkdir /usr/local/nginx

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=./nginx-upload-module-2.3.0 --with-pcre=/data/dev/servers/pcre-8.35make && make install

三、启动一个python后台服务,用于上传到临时路径文件,转移到正式路径

  • 安装python3:https://blog.csdn.net/hefrankeleyn/article/details/122635487
#! python3
# -*- coding: UTF-8 -*-
###########################
#
# description: nginx上传文件,将临时路径的文件拷贝到正式路径
# author: LiFei  
# mail: hefrankeleyn@gmail.com
# date: 2023-08-19
#  pip install Flask
#
###########################import logging,os,datetime, shutil, json,socket
from flask import Flask,request,abort,make_response
logging.basicConfig(level=logging.INFO, format="%(asctime)s- %(name)s %(levelname)s- %(message)s")
# 创建一个应用
app = Flask(__name__)
base_dir="/data/dev/nginxUploadFiles"# 创建目录,如果目录不存在
def createDirIfNotExists(dirPath):if not dirPath:returnif not (os.path.exists(dirPath) and os.path.isdir(dirPath)):os.makedirs(dirPath)# 创建子路径
def createSubDir(params):sub_file_dir = ""if "busType" in params:busType = str(params["busType"]).replace(' ', '')if busType:sub_file_dir = os.path.join(sub_file_dir, busType)one_day = datetime.datetime.now().strftime('%Y%m%d')sub_file_dir = os.path.join(sub_file_dir, one_day)createDirIfNotExists(os.path.join(base_dir, sub_file_dir))return sub_file_dir# 将临时文件拷贝到正式文件目录
def exeUpload(params):if not params:abort(400)bus_file_name = params["file.name"]file_type = params["file.content_type"]tmp_file_path = params["file.path"]file_md5 = params["file.md5"]file_size = params["file.size"]real_filename = file_md5 + (bus_file_name[bus_file_name.rfind("."):] if bus_file_name.rfind(".")!=-1 else "")subDirPath = createSubDir(params)target_file_path = os.path.join(base_dir, subDirPath, real_filename)# 将临时路径文件拷贝到正式路径shutil.copyfile(tmp_file_path, target_file_path)# 这个路径,可以访问正式目录下的文件base_url = "http://%s:8088/" % (socket.gethostbyname(socket.gethostname()))# 返回结果json_data = json.dumps({"file_name": bus_file_name,"content_type": file_type,"file_md5": file_md5,"file_size": file_size,"file_path": target_file_path,"base_url": base_url,"sub_file_path": os.path.join(subDirPath, real_filename)})response = make_response(json_data)headers = {"content-type": "application/json; charset=utf-8"}response.headers = headersreturn response@app.route("/upload", methods=["POST", 'GET'])
def nginxUpload():if request.method == "POST":try:params = request.form.to_dict()response = exeUpload(params)return responseexcept Exception as e:err_str = str(e)response = make_response(err_str, 500)headers = {"content-type": "text/plain; charset=utf-8"}response.headers = headersreturn responseelse:response = make_response("<p>错误的请求类型</p>", 500)headers = {"content-type": "text/plain; charset=utf-8"}response.headers = headersreturn responseif __name__ =="__main__":app.run(host="0.0.0.0", port=2230)

启动服务:

nohup python3 nginxUploadPassServer.py 1>nohup.out 2>&1 &

四、添加nginx配置

nginx.conf

user root;
worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;include /usr/local/nginx/conf/conf.d/*.conf;
}

conf.d/nginx_80.conf

    server {listen       80;server_name  localhost;location / {root   html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}

(1)配置一个静态文件服务

conf.d/nginx_80.conf

    server {listen       8088;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {alias  /data/dev/nginxUploadFiles/;autoindex on;#root   html;#index  index.html index.htm;}}

(2)配置上传文件服务

conf.d/nginxUplaod.conf

server {listen 5312;client_max_body_size 100m;location /upload {# 转到后端处理的URL,表示Nginx接受完上传的文件后,然后交给后端处理的地址upload_pass @fileserver_backend;# 上传模块接收到文件,临时存放的路径,1 表示方法,该方法需要在/tmp/nginx_upload 下创建以0 到 9位目录,上传的时候会进行一散列处理。 mkdir -p /tmp/nginx_upload/{0,1,2,3,4,5,6,7,8,9}; chmod 777 -R /tmp/nginx_uploadupload_store /tmp/nginx_upload 1;# 上传文件的权限,rw表示读写,r只读upload_store_access user:rw group:rw all:rw;set $upload_field_name "file";# 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 模块自动生成一些信息,如文件大小,文件的md值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$";# 如果pass页面出现以下状态码,就删除本次上传的临时文件upload_cleanup 400 404 499 500-505;# 打开开关, 把前段脚本请求的参数传给后端的脚本语言upload_pass_args on;}location @fileserver_backend {proxy_pass http://localhost:2230;}
}

五、启动nginx和python服务

启动nginx

cd /usr/local/nginx

./sbin/nginx

nginx其它命令

./sbin/nginx -s reload
./sbin/nginx -s stop

启动python服务:

nohup python3 nginxUploadPassServer.py 1>nohup.out 2>&1 &

六、python程序测试上传

#! python3
# -*- coding: UTF-8 -*-
###########################
#
# description: 执行上传
# author: LiFei  
# mail: hefrankeleyn@gmail.com
# date: 2023-08-19
#
###########################
import logging, os, requests
logging.basicConfig(level=logging.INFO, format="%(asctime)s- %(name)s %(levelname)s- %(message)s")def uploadFile(upload_url, file_path, content_type):try:if not (os.path.exists(file_path) and os.path.isfile(file_path)):raise Exception("要上传的文件不存在:" + str(file_path))data = {"busType": "myPro"}fileName = os.path.split(file_path)[-1]files = {"file": (fileName, open(file_path, 'rb'), content_type)}response = requests.post(upload_url, files=files, data=data)return responseexcept Exception as e:logging.error(e)raise eif __name__=="__main__":upload_url = "http://myip:5312/upload"file_path = r"/Users/lifei/Documents/workspace/git_test_wp/myproject/wuyishan.jpg"content_type = "image/jpeg"response = uploadFile(upload_url, file_path, content_type)logging.info(response.json())

之后就可以访问到:

http://myip:8088/myPro/20230819/cad0d40e01e0930cad9030f8cc32f68b.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/47369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5-重定向和路由的反向引用

重定向 和 反向引用 1. 重定向-redirect: 有两次响应 (1) 302状态码 Location (2) 返回location请求地址内容 2. 反向引用-url_for 路由中定义endpoint 参数,使用 url_for(函数名)进行反向引用 import jsonfrom flask import Flask, url_for, redirectimport settingsap…

List 分批处理

1.Google Guava <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>31.0.1-jre</version></dependency>List<String> tempList Arrays.asList("水星","金星&qu…

excel vba 将多张数据表的内容合并到一张数据表

功能描述&#xff1a; 一个Excel文件有很多个 样式相同 的数据表&#xff0c; 需要将多张数据表的内容合并到一张数据表里。 vba实现代码如下&#xff1a; Attribute VB_Name "NewMacros" Option Explicit Public Const Const_OutSheetName As String "V…

SOLIDWORKS基准面介绍

SOLIDWORKS是一款广泛应用于机械设计领域的三维建模软件&#xff0c;其中基准面是在建模过程中必不可少的要素。本文将介绍什么是SOLIDWORKS基准面&#xff0c;以及它在设计中的作用。 SOLIDWORKS基准面是指在设计过程中用来确定草图绘制、特征创建的参考平面。 SOLIDWORKS基…

天锐绿盾安全U盘系统

安全U盘系统 01 简介 天锐绿盾安全U盘系统&#xff0c;是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等&#xff0c;天锐绿盾安全U盘系统为您U盘的数据保驾护航&#xff0…

WPF入门到精通:4.页面增删改查及调用接口(待完善)

在WPF中&#xff0c;页面的增删改查可以通过使用DataGrid等控件来实现。接口的调用可以使用HttpClient或RestSharp等网络库来完成。 1.页面增删改查 使用DataGrid控件来展示数据&#xff0c;并通过绑定数据源来实现数据的增删改查操作。示例代码如下&#xff1a; XAML代码&a…

45、TCP的几个常用选项

前面用两节内容的篇幅介绍了TCP协议首部格式&#xff0c;TCP的基本功能都是靠其首部这些字段的支持。那么在固定首部之后&#xff0c;还有长度可变的选项字段&#xff0c;可以提供一些附加功能。既然是长度可变&#xff0c;说明选项肯定不止一个&#xff0c;这里面有些比较重要…

python 打印一个条形堆积图

背景 今天介绍一个不使用 matplot&#xff0c;通过 DebugInfo模块打印条形堆积图 的方法。 引入模块 pip install DebugInfo打印销售转化数据 下面的代码构建了两个销售团队&#xff0c;团队A 和团队B&#xff1b;两个团队的销售数据构成了公司总的销售成果。以条形堆积图的…

SQL Server、MySQL和Oracle数据库分页查询的区别与联系

摘要&#xff1a;本文将通过一个现实例子&#xff0c;详细解释SQL Server、MySQL和Oracle这三种常见关系型数据库在分页查询方面的区别与联系。我们将提供具体场景下的SQL语句示例&#xff0c;并解释每个数据库的分页查询用法以及优化方法&#xff0c;帮助读者更好地选择适合自…

Apache JMeter

下载 Apache JMeter 并安装 java链接 打开 apache-jmeter-5.4.1\bin 找到jmeter.bat 双击打开 或者 ApacheJMeter.jar 双击打开 设置中文 找到 options 》choose Language 》chinese 新建 计划 创建线程组 添加Http请求 配置元件添加请求头参数&#xff08;content-type&…

什么是PPS和TOD时序?授时防护设备是什么?

介绍 PPS和TOD PPS和TOD是两种用于精确时间同步的技术&#xff0c;它们在许多领域都有广泛的应用&#xff0c;总的来说&#xff0c;PPS和TOD被广泛应用于各种需要高度精确时间同步的领域&#xff0c;包括通信、测量、测试、系统集成和计算机网络等。 一、PPS PPS&#xff08…

RedisDesktopManager 连接redis

redis查看是否启动成功 ps -ef | grep redis以上未启动成功 cd /usr/local/bin/ 切换根目录 sudo -i 开启服务端 ./redis-server /usr/local/redis/redis.conf 开启客户端 ./redis-cli

Java【SpringBoot】SpringBoot 和 Spring 有什么区别? SpringBoot有哪些优点?

文章目录 前言一、Spring 特点二、SpringBoot 特点和优点总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, …

ElasticSearch学习2

1、索引的操作 1、创建索引 对ES的操作其实就是发送一个restful请求&#xff0c;kibana中在DevTools中进行ES操作 创建索引时需要注意ES的版本&#xff0c;不同版本的ES创建索引的语句略有差别&#xff0c;会导致失败 如下创建一个名为people的索引&#xff0c;settings&…

Java智慧工地系统源码(微服务+Java+Springcloud+Vue+MySQL)

智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台&#xff0c;是一种全新的管理模式&#xff0c;能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度&#xff0c;以及施工过程管理的进度、质量、安全三…

Day19-异步请求-axios文件上传

Day19-异步请求 什么是同步请求当前浏览器刷新或者改变浏览器地址栏地址才能发送请求,这种请求称为同步请求 什么是异步请求当我们发送请求时,浏览器不会刷新,浏览器地址栏也不会变化,这种请求称为异步请求异步请求用到的前端技术: ajax 或 axios一 封装Ajax /*** 编写ajax函…

cdh6.3.2 Flink On Yarn taskmanager任务分配倾斜问题的解决办法

业务场景&#xff1a; Flink On Yarn任务启动 组件版本&#xff1a; CDH&#xff1a;6.3.2 Flink&#xff1a;1.13.2 Hadoop&#xff1a;3.0.0 问题描述&#xff1a; 在使用FLink on Yarn调度过程中&#xff0c;发现taskmanager总是分配在集中的几个节点上&#xff0c;集群…

2023年Java核心技术面试第七篇(篇篇万字精讲)

十二 . Java 提供了哪些IO方式&#xff1f;NIO如何实现多路复用&#xff1f; IO是软件开发中的核心部分之一&#xff0c;伴随着海量数据增长和分布式系统的发展&#xff0c;IO扩展能力愈发重要。 12.1 典型回答&#xff1a;

记一次从Redis弱口令到RCE

Fscan扫描网段发现了一些开启了6379的服务器&#xff0c;逐个尝试了下未授权&#xff0c;然后尝试了下爆破 hydra爆破redis hydra -P [字典目录] redis://xxx.xxx.xxx.xxx结果还真让爆出来一个 得到密码后&#xff0c;连接上去&#xff0c;这里用的是Another Redis Desktop M…

飞机打方块(四)游戏结束

一、游戏结束显示 1.新建节点 1.新建gameover节点 2.绑定canvas 3.新建gameover容器 4.新建文本节点 2.游戏结束逻辑 Barrier.ts update(dt: number) {//将自身生命值取整let num Math.floor(this.num);//在Label上显示this.num_lb.string num.toString();//获取GameCo…