利用Nginx怎么实现一个文件下载功能
创始人
2024-11-27 09:21:32
0次

一、配置

http {
 ...
 server: {
 # 配置下载
  location /download {
   root D:\\download;
   autoindex on;
   autoindex_exact_size off;
  }
 }
 ...
}

利用Nginx怎么实现一个文件下载功能

  这是目录里随便放的几个文件,可以看到实现成功。

  这里踩过几个坑,下面提示下:

1、root路径配置问题

  刚开始配置的 alias D:\download,报错:2020/08/14 10:36:06 [emerg] 26396#16140: invalid number of arguments in "alias" directive in D:\Program File\nginx\nginx-1.13.12/conf/nginx.conf:74

  那么查配置 74 行,发现少了分号,加上问题依旧。换成 root D:\download;,报错:2020/08/14 10:44:20 [emerg] 21376#17156: invalid number of arguments in "root" directive in D:\Program File\nginx\nginx-1.13.12/conf/nginx.conf:74

  问题依旧,后来发现路径有问题,写错了,应该是

root D:/download;
// 或者
root D:\\download;

  原因都懂,就是 \ 只是个转义字符,要么用 \\,要么就用 /

2、root与alias差别

  ok,这样配置可以了。但是当我输入:http://localhost/download/,报错404,我的D盘目录下为D:/download/*,然后其他文件

  刚开始报错:2020/08/14 11:02:49 [error] 9928#12876: *11 CreateFile() "D:\download\/download" failed (2: The system cannot find the file specified), client: 127.0.0.1, server: , request: "GET /download HTTP/1.1", host: "localhost"

  看到这个路径D:\download\/download这里有问题,所以我把配置rootD:/download/;,后面的 / 去掉了,再试,还是报错:2020/08/14 11:04:15 [error] 3128#11636: *1 CreateFile() "D:\download/download" failed (2: The system cannot find the file specified), client: 127.0.0.1, server: , request: "GET /download HTTP/1.1", host: "localhost"

  所以考虑到不是路径的问题,那么问题原因在哪?在于 root 与 alias 配置的区别。

利用Nginx怎么实现一个文件下载功能

  也就是说 当 rootD:/download; 时,你请求http://localhost/download/,他找的是:D:\download\download

  而当 alias D:/download; 时,你请求http://localhost/download/,他找的才是:D:\download

  那么我把我的本地路径改一下:D:/download/download/*,然后再是其他文件,那么就成功了。

3、中文文件问题

  还有坑,点击全英文名文件是正常预览下载的,中文名文件报错。在 server段中添加 charset utf-8; 也不行,或者 charset gbk,utf-8; 也不行。有清楚的,烦请不吝赐教,谢谢。

  思考良久,应该不是nginx配置的问题了,因为很多地方都说这样配置就可以显示中文了。然后我想到会不会是系统编码问题呢?我用本地做服务器。使用chcp命令查了一下系统编码,显示936。一般正常能显示中文的是936,那说明没问题。

  虽然中文显示是正常的,但是**的,一点还是报错,乱码或者404。没办法直接点击下载中文名文件,或者浏览中文名目录。

  中文名文件下载可以通过 复制文件名,然后贴在浏览器url后面,就可以下载下来了,中文名目录是真的无法浏览!!!

  原因是,windows服务器中文是gbk编码,nginx的这种页面的href就是用gbk进行urlencode的,然后一般浏览器都是使用utf-8的,当然就没法访问了。

4、想防止浏览器自动打开文件而不是下载文件,添加

add_header Content-Disposition "attachment;";
// 所有文件都不打开
location / {
 add_header Content-Disposition "attachment;filename*=utf-8'zh_cn'$arg_n";
}

  一般存储在服务器上的文件都不会用原来的名字,所以下载的时候需要改名,可通过url中添加参数,然后在nginx中根据参数来改名。

  举例:参数为 n=xxx.jpg

  url:https"//xxxxx?n=xxx.jpg //表示把下载下来的文件名字改为xxx.jpg

  nginx需要配置成

location / {
  if ($request_uri ~* ^.*\?n=([^&]+)$) {
    add_header Content-Disposition "filename*=$arg_n";
  }
}

  注释:里面的utf-8是有些浏览器会自动把文件改成urlencode的格式

  一般1,2都是要一起配置的

location / {
  if ($request_uri ~* ^.*\?n=([^&]+)$) {
    add_header Content-Disposition "attachment;filename*=$arg_n";
  }
}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...