1. 程式人生 > >使用nginx搭建文件下載服務器

使用nginx搭建文件下載服務器

oca eve 目錄 acc rem form nload java ref

搭建一個文件服務器的方式有很多,本文介紹筆者曾經用過的兩種:

  • 使用nginx
  • 使用java服務,通過controller提供

一、使用nginx搭建

在nginx.conf中直接配置server即可,示例代碼如下:

user felice felice;
worker_processes auto;
master_process on;
pid log/nginx.pid;

error_log log/error.log warn;
error_log log/info.log info;

events {
    worker_connections  4096;
}

http {
    server_tokens off;

    client_header_buffer_size 8k;
    client_max_body_size 130m;
    proxy_buffer_size   64k;
    proxy_buffers   
8 64k; log_format access $remote_addr $host $remote_user [$time_local] $status $request_length $body_bytes_sent $request_time 0 0 0 - "-" "$request" "$http_referer" "$http_user_agent" $http_cookie $bytes_sent; access_log log/access.log access; keepalive_requests 16; keepalive_timeout
5; server { listen 8123; server_name localhost; charset utf-8; location / { default_type application/octet-stream; add_header Content-disposition "attachment"; root /User/sonofelice/mm; } } }

啟動nginx之後,通過請求下面的url就可以下載/User/sonofelice/mm目錄下的文件了:

http://127.0.0.1:8123/fileName

在host:port/後面直接跟對應目錄下的文件名稱即可。

如果強制瀏覽器下載文件,而不是進行json解析後直接顯示內容,需要設置header選項

add_header Content-disposition "attachment";

二、使用java服務

使用java的controller提供文件下載也非常簡單,可以用下面的幾行代碼搞定:

@RestController
@RequestMapping("/")
@Slf4j
public class FileDownloadController {

    @RequestMapping(method = RequestMethod.GET, value = "/{fileName}")
    public void downloadFile(@PathVariable String fileName, HttpServletResponse response) {
        Path file = Paths.get(fileName);
        if (Files.exists(file)) {
            response.setContentType("application/zip");
            try {
                response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
                Files.copy(file, response.getOutputStream());
            } catch (IOException e) {
                log.error("File download error:", e);
            }
        }
    }
}

在啟動java服務之後,也可以通過第一節中的方式請求url進行文件的下載。

只傳入文件名即可。當然,上面的contentType設置的是zip,如果不確定文件的格式,可以使用

application/octet-stream

HTTP Content-type常用對照表參考: http://tool.oschina.net/commons

使用nginx搭建文件下載服務器