<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
為了讓nginx支援檔案上傳,需要下載並執行帶有nginx-upload-module模組的容器:
sudo podman pull docker.io/dimka2014/nginx-upload-with-progress-modules:latest sudo podman -d --name nginx -p 83:80 docker.io/dimka2014/nginx-upload-with-progress-modules
該容器同時帶有nginx-upload-module模組和nginx-upload-progress-module模組。
注意該容器是Alpine Linux
,沒有bash,有些命令與其它發行版本的Linux不一樣。
使用下面的命令進入容器:
sudo podman exec -it nginx /bin/sh
作為檔案伺服器, 需要顯示本地時間,預設不是本地時間。通過下面一系列命令設定為本地時間:
apk update apk add tzdata echo "Asia/Shanghai" > /etc/timezone rm -rf /etc/localtime cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime apk del tzdata
建立檔案伺服器的根目錄:
mkdir -p /nginx/share
組態檔的路徑為/etc/nginx/conf.d/default.conf
,作為
server { …… charset utf-8; # 設定字元編碼,避免中文亂碼 location / { root /nginx/share; # 根目錄 autoindex on; # 開啟索引功能 autoindex_exact_size off; # 關閉計算檔案確切大小(單位bytes),只顯示大概大小(單位kb、mb、gb) autoindex_localtime on; # 顯示本地時間 } }
此時我們的檔案服務就設定好了,需要使用下面的命令讓設定生效:
nginx -s reload
上面的設定已經完成檔案伺服器的設定了,但是不能上傳檔案,想要上傳檔案,還需要做如下設定:
server { …… charset utf-8; # 設定字元編碼,避免中文亂碼 client_max_body_size 32m; upload_limit_rate 1M; # 限制上傳速度最大1M # 設定upload.html頁面路由 location = /upload.html { root /nginx; # upload.html所在路徑 } location /upload { # 限制上傳檔案最大30MB upload_max_file_size 30m; # 設定後端處理交由@rename處理。由於nginx-upload-module模組在儲存時並不是按上傳的檔名儲存的,所以需要自行改名。 upload_pass @rename; # 指定上傳檔案存放目錄,1表示按1位雜湊,將上傳檔案隨機存到指定目錄下的0、1、2、...、8、9目錄中(這些目錄要手動建立) upload_store /tmp/nginx 1; # 上傳檔案的存取許可權,user:r表示使用者唯讀,w表示可寫 upload_store_access user:r; # 設定傳給後端處理的表單資料,包括上傳的原始檔名,上傳的內容型別,臨時儲存的路徑 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_pass_form_field "^submit$|^description$"; # 設定上傳檔案的md5值和檔案大小 upload_aggregate_form_field "${upload_field_name}_md5" "$upload_file_md5"; upload_aggregate_form_field "${upload_field_name}_size" "$upload_file_size"; # 如果出現下列錯誤碼則刪除上傳的檔案 upload_cleanup 400 404 499 500-505; } location @rename { # 後端處理 proxy_pass http://localhost:81; } }
上面的設定中,臨時儲存時是按1位雜湊來儲存的,需要在上傳目錄下手動建立0~9幾個目錄。
mkdir -p /tmp/nginx cd /tmp/nginx mkdir 1 2 3 4 5 6 7 8 9 0 chown nginx:root . -R
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>上傳</title> </head> <body> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <form name="upload" method="POST" enctype="multipart/form-data" action="upload"> <input type="file" name="file"/> <input type="submit" name="submit" value="上傳"/> </form> </body> </html>
需要先安裝python及所需的庫
apk add python3 pip3 install bottle pip3 install shutilwhich
python服務原始碼:
#!/usr/bin/python3 # -*- coding: utf-8 -*- from bottle import * import shutil @post("/upload") def postExample(): try: dt = request.forms.dict filenames = dt.get('file.name') tmp_path = dt.get("file.tmp_path") filepaths = dt.get("file.path") count = filenames.__len__() dir = os.path.abspath(filepaths[0]) for i in range(count): print("rename %s to %s" % (tmp_path[i], os.path.join(dir, filenames[i]))) target = os.path.join(dir, filenames[i]) shutil.move(tmp_path[i], target) shutil.chown(target, "nginx", "root") # 由於shutil.move不會保持使用者歸屬,所以需要顯示修改,否則存取時會報403無存取許可權 except Exception as e: print("Exception:%s" % e) redirect("50x.html") # 如果是在容器中部署的nginx且對映了不同的埠,需要指定IP,埠 redirect('/') # 如果是在容器中部署的nginx且對映了不同的埠,需要指定IP,埠 run(host='localhost', port=81)
# 開闢一個空間proxied來儲存跟蹤上傳的資訊1MB upload_progress proxied 1m; server { …… location ^~ /progress { # 報告上傳的資訊 report_uploads proxied; } location /upload { ... # 上傳完成後,仍然儲存上傳資訊5s track_uploads proxied 5s; } }
<form id="upload" enctype="multipart/form-data" action="/upload" method="post" onsubmit="openProgressBar(); return true;"> <input name="file" type="file" label="fileupload" /> <input type="submit" value="Upload File" /> </form> <div> <div id="progress" style="width: 400px; border: 1px solid black"> <div id="progressbar" style="width: 1px; background-color: black; border: 1px solid white"> </div> </div> <div id="tp">(progress)</div> </div> <script type="text/javascript"> var interval = null; var uuid = ""; function openProgressBar() { for (var i = 0; i < 32; i++) { uuid += Math.floor(Math.random() * 16).toString(16); } document.getElementById("upload").action = "/upload?X-Progress-ID=" + uuid; /* 每隔一秒查詢一下上傳進度 */ interval = window.setInterval(function () { fetch(uuid); }, 1000); } function fetch(uuid) { var req = new XMLHttpRequest(); req.open("GET", "/progress", 1); req.setRequestHeader("X-Progress-ID", uuid); req.onreadystatechange = function () { if (req.readyState == 4) { if (req.status == 200) { var upload = eval(req.responseText); document.getElementById('tp').innerHTML = upload.state; /* 更新進度條 */ if (upload.state == 'done' || upload.state == 'uploading') { var bar = document.getElementById('progressbar'); var w = 400 * upload.received / upload.size; bar.style.width = w + 'px'; } /* 上傳完成,不再查詢進度 */ if (upload.state == 'done') { window.clearTimeout(interval); } if (upload.state == 'error') { window.clearTimeout(interval); alert('something wrong'); } } } } req.send(null); } </script>
參考:
https://breeze2.github.io/blog/scheme-nginx-php-js-upload-process
https://www.tiantanhao.com/34031.html
https://blog.csdn.net/scugxl/article/details/107180138
到此這篇關於容器中使用ngnix搭建支援上傳下載的檔案伺服器的文章就介紹到這了,更多相關ngnix檔案伺服器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45