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

  介绍

本篇文章为大家展示了利用Nginx怎么实现一个文件下载功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>一、配置

http  {   ,……   ,服务器:{   ,#配置下载   的位置才能/download  {   ,,root  D: \ \下载;   ,,autoindex ;   ,,autoindex_exact_size ;   ,,}   ,}   ,……   }

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

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

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

<强> 1,根路径配置问题

刚开始配置的别名D: \下载,报错:2020/08/14 10:36:06(紧急情况)26396 # 16140:无效的参数数量“alias"指令在D: \程序文件\ nginx \ nginx-1.13.12/conf/nginx。相依:74

那么查配置74行,发现少了分号,加上问题依旧。换成根D: \下载;报错:2020/08/14 10:44:20(紧急情况)21376 # 17156:无效的参数数量“root"指令在D: \程序文件\ nginx \ nginx-1.13.12/conf/nginx。配置:74

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

root  D:/下载;//,或者   root  D: \ \下载;

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

<强> 2根与别名差别

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

刚开始报错:2020/08/14 11:02:49(错误)9928 # 12876:11 *它仅仅()“D: \ \/download"下载;失败(2:系统找不到指定的文件),客户:127.0.0.1,服务器:要求:“HTTP/1.1/下载“,主持人:“localhost"

看到这个路径D: \ \/下载下载这里有问题,所以我把配置rootD:/下载/,,后面的/去掉了,再试,还是报错:2020/08/14 11:04:15(错误)3128 # 11636:* 1它仅仅()“D: \下载/download"失败(2:系统找不到指定的文件),客户:127.0.0.1,服务器:要求:“HTTP/1.1/下载“,主持人:“localhost"

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

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

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

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

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

<强> 3中文文件问题

还有坑,点击全英文名文件是正常预览下载的,中文名文件报的错。在服务器段中添加utf - 8字符集;也不的行,或者<代码>字符集gbk, utf - 8;>

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

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

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

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

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

add_header  Content-Disposition “附件;“ //,所有文件都不打开   位置/,{   ,add_header  Content-Disposition “附件文件名*=utf - 8 # 39; zh_cn # 39; arg_n"美元;;   }

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

举例:参数为n=xxx.jpg

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

nginx需要配置成

的位置/,{   if  (request_uri 美元;~ * ^。* \ ? n=([^和]+)美元),{   add_header  Content-Disposition “文件名*=$ arg_n";   }   }

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

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