nginx服务器实现上传下载文件

作者

QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118

参考

Nginx文件服务器
使用nginx搭建文件服务器
使用nginx作为文件服务器
nginx搭文件服务器
利用nginx搭建小型的文件服务器
Nginx文件上传下载实现与文件管理
nginx上传模块nginx_upload_module和nginx_uploadprogress_module模块进度显示,如何传递GET参数等。
nginx上传模块nginx_upload_module使用
加上上传模块的nginx编译和配置
nginx upload模块+python 后端处理模仿fastdfs实现文件存取
实现Nginx Upload 模块 功能上传文件。
Upload module官网
github Upload module官网
NGINX Upload Progress Module
github Upload Progress Module
www/nginx unknown directive “upload_progress” after upgrade 1.12.2_4,2 -> 1.12.2_6,2

下载

更新配制文件,添加如下字段,这里用alias实现把嵌入式开发板的根目录全部映射过去,

location /download {
    alias   /;
    autoindex on; 
    autoindex_localtime on;
    autoindex_exact_size off;
} 

执行,

$ ./nginx/sbin/nginx -p ./nginx -s reload

上传

需要有nginx的源码,重新编译nginx,添加上传模块,上传进度模块,

$ ./configure --add-module=$parent_path/nginx-upload-module-2.3.0 --add-module=$parent_path/nginx-upload-progress-module-0.8.4
$ make
$ make install

注意上传进度模块,到0.9版本有一个不兼容的更改,

in version 0.9.0 there is INCOMPATIBLE CHANGE: JSONP is now the default output of the progress probes. If you rely on this module serving the deprecated java output use:

upload_progress_java_output
in the progress probe location.

添加配置文件,

location /upload {  
    upload_pass     /;  
    # upload_cleanup 400 404 499 500-505;  
    upload_store    /boot;  
    upload_store_access user:rw;  
    # upload_limit_rate 128k;  
    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_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 "^.*$";  
}

建立html测试,使用fcgi,

printf("<form method=\"POST\" enctype=\"multipart/form-data\" action=\"uploademmc\"\n");
printf("<p>File Upload:\n");
printf("<input type=\"file\" name=\"file\" value=\"\">\n");
printf("<p>\n");
printf("<input type=\"submit\" name=\"uploademmc\" value=\"uploademmc\">\n");
printf("<p>\n");
printf("</form>\n");

上传,0000000001即为新上传的文件,这里必须用脚本在上传结束后来执行重命名操作,

root@zynqmp:~# ls -l /boot
total 53172
-rw-------    1 root     root         31428 Jan 26 16:11 0000000001
-rw-r--r--    1 root     root      14283264 Jan 26 12:06 Image
-rwxr-xr-x    1 root     root      19311212 Jan  1  1970 MWM178_V1_U6_V1.bit
-rw-r--r--    1 root     root       1118392 Jan 26 06:47 boot.bin
-rw-r--r--    1 root     root      19634147 Jan 26 00:56 rootfs.ext4.gz.uboot
-rw-r--r--    1 root     root         29091 Jan 26 06:47 system.dtb

上传使用post方法,后端接收到的字符串为如下格式,可以看到文件名在file_name字段中,可利用环境变量REQUEST_URI提取出来即可,

------WebKitFormBoundarygKAThjQRpvOwowzR
Content-Disposition: form-data; name="file_name"

11.PNG
------WebKitFormBoundarygKAThjQRpvOwowzR
Content-Disposition: form-data; name="file_content_type"

image/png
------WebKitFormBoundarygKAThjQRpvOwowzR
Content-Disposition: form-data; name="file_path"

/boot/0023791667
------WebKitFormBoundarygKAThjQRpvOwowzR
Content-Disposition: form-data; name="file_md5"

0276e88e6161ac806d46ee0afb45976e
------WebKitFormBoundarygKAThjQRpvOwowzR
Content-Disposition: form-data; name="file_size"

17734
------WebKitFormBoundarygKAThjQRpvOwowzR
Content-Disposition: form-data; name="uploademmc"

uploademmc
------WebKitFormBoundarygKAThjQRpvOwowzR--

FCGI_ROLE=RESPONDER
SCRIPT_FILENAME=./nginx/html/index.cgi
QUERY_STRING=
REQUEST_METHOD=POST
CONTENT_TYPE=multipart/form-data; boundary=----WebKitFormBoundarygKAThjQRpvOwowzR
CONTENT_LENGTH=706
SCRIPT_NAME=/index.cgi
REQUEST_URI=/uploademmc

上传进度模块需要前端js协助,配置文件,前面提到的0.9版本有一个不兼容的更改,如果需要和老版本兼容,需要在location ^~ /progress中添加upload_progress_java_output

http {
    ...
    upload_progress proxied 5m;
    
    server {
        ...

        location = / {
            fastcgi_pass 127.0.0.1:8088;
            fastcgi_index index.cgi;
            include fastcgi.conf;
        }

        location /download {
            alias   /;
            autoindex on; 
            autoindex_localtime on;
            autoindex_exact_size off;
        } 

        location /upload {  
            upload_pass     /;  
            # upload_cleanup 400 404 499 500-505;  
            upload_store    /boot;  
            upload_store_access user:rw;  
            # upload_limit_rate 128k;  
            client_max_body_size 8g;
            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_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 "^.*$";  
            track_uploads proxied 30s;
        }

        location ^~ /progress {
            # report uploads tracked in the 'proxied' zone
            report_uploads proxied;
            # upload_progress_java_output;
        }

        location ~ \.js$ {
            root html;
        }

设置参数client_max_body_size 8g,否则上传时会报错413 Request Entity Too Large,编写html,

printf("<form id=\"upload\" method=\"POST\" enctype=\"multipart/form-data\" action=\"upload\" οnsubmit=\"openProgressBar(); return true;\"\n");
printf("<p>File Upload:\n");
printf("<input type=\"file\" name=\"file\" value=\"\">\n");
printf("<p>\n");
printf("<input type=\"submit\" name=\"upload\" value=\"upload\">\n");
printf("<p>\n");
printf("</form>\n");
printf("<div>\n");
printf("<div id=\"progress\" style=\"width: 400px; border: 1px solid black\">\n");
printf("<div id=\"progressbar\" style=\"width: 1px; background-color: blue; border: 1px solid white\">&nbsp;</div>\n");
printf("</div>\n");
printf("<div id=\"tp\">(progress)</div>\n");
printf("</div>\n");

添加js文件,

interval = null;

function openProgressBar() {
 /* generate random progress-id */
 uuid = "";
 for (i = 0; i < 32; i++) {
  uuid += Math.floor(Math.random() * 16).toString(16);
 }
 /* patch the form-action tag to include the progress-id */
 document.getElementById("upload").action="/upload?X-Progress-ID=" + uuid;

 /* call the progress-updater every 1000ms */
 interval = window.setInterval(
   function () {
     fetch(uuid);
   },
   1000
 );
}

function fetch(uuid) {
 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) {
    /* poor-man JSON parser */
    var upload = eval(req.responseText);

    document.getElementById('tp').innerHTML = upload.state;

    /* change the width if the inner progress-bar */
    if (upload.state == 'done' || upload.state == 'uploading') {
     bar = document.getElementById('progressbar');
     w = 400 * upload.received / upload.size;
     bar.style.width = w + 'px';
    }
    /* we are done, stop the interval */
    if (upload.state == 'done') {
     window.clearTimeout(interval);
    }
   }
  }
 }
 req.send(null);
}

测试一下,chrome自己也会统计上传进度,标题栏开始小圆圈刷新,
在这里插入图片描述

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要在 Windows 中搭建一个支持上传和下载文件文件服务器,可以使用 Nginx 和一些插件来实现。以下是步骤: 1. 下载 Nginx for Windows,可以从官网下载:http://nginx.org/en/download.html 2. 解压缩下载Nginx 文件到某个目录下,例如 C:\nginx。 3. 在 C:\nginx\conf 目录下创建一个名为 nginx.conf 的文件,并在其中添加以下配置: ``` worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root C:/nginx/html; index index.html index.htm; autoindex on; } location /upload { client_max_body_size 100m; alias C:/nginx/upload/; autoindex on; dav_methods PUT DELETE MKCOL COPY MOVE; dav_access user:rw group:rw all:r; } } } ``` 这个配置文件中定义了一个 http 服务,监听 80 端口,其中 /upload 路径是用来上传文件的,其它路径是用来下载文件的。注意修改 root 和 alias 的路径为你自己的路径。 4. 在 C:\nginx\html 目录下创建一个名为 index.html 的文件,用于测试下载文件是否成功。 5. 在 C:\nginx\upload 目录下创建一个名为 index.html 的文件,用于测试上传文件是否成功。 6. 启动 Nginx,打开命令行窗口,切换到 C:\nginx 目录下,执行命令:nginx.exe。 7. 打开浏览器,访问 http://localhost/,应该可以看到 index.html 页面,用于测试下载文件是否成功。 8. 打开浏览器,访问 http://localhost/upload/,应该可以看到 index.html 页面,用于测试上传文件是否成功。 现在你的文件服务器已经搭建好了,可以用来上传和下载文件了。上传文件时,可以使用 PUT 方法,例如使用 curl 命令上传文件: ``` curl -T file.txt http://localhost/upload/ ``` 下载文件时,可以使用 GET 方法,例如使用浏览器访问 http://localhost/file.txt。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值