前言:
这三天里,因为之前没接触过nginx 服务器,然后看了网上的一些教程。我 天,恼火了。竟然出现了巨多的错误,吓着我感觉抱起了瘦瘦的自己。于是乎,我自己亲自去看了官网的api 。苦苦研究了三天,终于迎刃而解解决了文件的上传和下载
首先,我们来了解一下令人厌烦的404、403、500吧
404错误页面
404是一个http错误代码,即请求的网页不存在。代码404的第一个“4”代表客户端的错误,如错误的网页位置,后两的数字码则代表着特定的错误讯息。404页面就是当用户输入了错误的链接或访问了一个不存在的地址时返回的页面,目的是告诉浏览者其所请求的页面不存在或链接错误,同时引导用户使用网站其他页面而不是关闭窗口离开。
当我们访问一个网站的时候,如果输入了一个错误的URL地址,或者这个地址的页面已经删除,那么,服务器就会返回一个页面,这个页面就是我们说的404页面。这种情况经常发生,是很难避免。 比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链 接拼写错误等,导致原来的URL地址无法访问;当Web服务器接到类似请求时,会返回一个404状态码,告诉浏览器要请求的资源并不存在。
状态码 403 Forbidden 代表客户端错误,指的是服务器端有能力处理该请求,但是拒绝授权访问。
这个状态类似于 401,但进入该状态后不能再继续进行验证。该访问是长期禁止的,并且与应用逻辑密切相关(例如不正确的密码)。
而什么是500呢
500错误
500服务器内部错误(Internal server error)主要是由于IWAM账号的密码错误造成的。该错误说明IIS服务器无法解析ASP代码,访问一个静态页面试试是否也出现这个问题,如果访问静态页面没问题,那就要分以下几种 情况来分析了: ① 你是否改变过计算机名称。 ② 站点所在的文件目录是否自定义了安全属性。 ③ 安装了域控制器后是否调整了域策略。如果是其中的一种情况,请一一将 改变的参数设置回来看是否解决问题。 如果静态空间也无法访问,则说明解析还没生效。
于是乎,我就看了官网的nginx 的相关文档。
首先,下载nginx 的服务器安装包,因为不同的系统都有对应的版本的nginx的官网
可以看到,如图的图片
然鹅,因为我是在window 机子上使用,所以我下了一个windows 版本的nginx-1.17.2.zip
直接就可以使用了,然后,你会惊奇地发现。下图是我解压到D:ngnix-server 目录下的图片
双击;ngnix.exe 就能使用了 在浏览器上输入:http://localhost/ 就会惊奇地发现,如下图就说明可以使用了。但是,因为我不想用默认的配置,于是乎。我重新配置了下 conf 目录下面的ngnix.conf 配置文件。
主要改的地方是80 端口下面的 root 哪里,我把他改为了我本地的D:/nginx-server/images;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root D:/nginx-server/images;
index index.html index.htm;
}
再然后,我们试着浏览浏览服务器下的图片,OK,访问成功,说明ngnix 没毛病了
下面,我们都写程序的部分的。用的是IDEA编译器。建一个web 项目
源码如下
后台代码
后台代码上传文件
package com.qianfeng.ps.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.*;
import java.util.UUID;
@WebServlet(value = "/file", name = "FileServlet", loadOnStartup = 1)
@MultipartConfig /** 告诉该Servlet,你要处理的是一个 “多媒体的表单数据” */
public class FileServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("FileServlet method invoked .....");
}
private String fileLocation = "D:/nginx-server/images/";
private String fileServer = "http://localhost/";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//获取上传的文件的所有的信息,part中封装要上传的文件的所有信息
// <input type="file" name="avatar"><br>
Part part = req.getPart("avatar");
// part.getName(); //通过part.getName() 得到不是文件名
//获取文件的名字, 文件名是在Part的头部, "content-disposition"中存储有文件名
// contentDisposition的数据内容是: form-data; name="avatar"; filename="4月8日复习.txt"
String contentDisposition = part.getHeader("content-disposition");
String filePrefix = "filename=\""; // \n \t \"
//获取文件名开始位置所在的索引
int index = contentDisposition.indexOf(filePrefix) + filePrefix.length();
//获取文件名, contentDisposition.length() - 1 原因是因为最后有个 "
String fileName = contentDisposition.substring(index, contentDisposition.length() - 1);
// 获取文件的后缀名: .png .txt .jpg
String fileSuffix = fileName.substring(fileName.indexOf("."));
// UUID.randomUUID().toString() 随机生成一个字符串
String newFileName = UUID.randomUUID().toString() + fileSuffix;
InputStream is = part.getInputStream(); //获取文件的输入流
//文件输出流
OutputStream os = new FileOutputStream(fileLocation + newFileName);
// 存储IO流每次读取的数据
byte[] bs = new byte[1024];
int length = 0; //每次读取的长度
while(-1 != (length = is.read(bs))) {
os.write(bs, 0, length);
}
os.flush();
os.close();
is.close();
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
StringBuffer html = new StringBuffer();
html.append("<html>")
.append("<head></head>")
.append("<body><h1>上传成功</h1>")
// fileServer + newFileName = http://localhost/0dc725b1-5b12-4865-bbd0-2fbed66b9e7e.png
.append("<img src=\"" + fileServer + newFileName + "\">")
.append("<video src=\"" + fileServer + newFileName + "\" width=\"600\" height=\"400\" autoplay>")
.append("</body></html>");
// String html = "<html><head></head><body><h1>注册成功</h1><p>" + user.getInterests() + "</p></body></html>";
writer.write(html.toString());
writer.flush();
writer.close();
}
}
后台代码下载文件
package com.qianfeng.ps.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
@WebServlet(value = "/download", name = "DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
// private String resourceLocatoin = "D:/nginx-server/images/abc.mp4";
private String resourceLocatoin = "D:/nginx-server/images/"; //文件存放的地址
/**
* 下载是一个get请求
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// <a href="download?name=0dc725b1-5b12-4865-bbd0-2fbed66b9e7e.png">下载</a><br>
//String name = req.getParameter("name"); //将要下载的文件名
/***
InputStream is = new FileInputStream(resourceLocatoin);
String fileName = "上课视频.mp4"; //文件名
byte[] bs = new byte[2048];
int length = 0;
// 处理中文文件下载的时候,浏览器显示乱码的问题
String cnFileName = URLEncoder.encode(fileName, "utf-8");
// 下载需要设置头信息, 是一种固定的模式
resp.setHeader("Content-Disposition", "attachment; filename=" + cnFileName);
ServletOutputStream servletOutputStream = resp.getOutputStream();
while(-1 != (length = is.read(bs))) {
servletOutputStream.write(bs, 0, length);
}
servletOutputStream.flush();
servletOutputStream.close();
is.close();
*/
String name = req.getParameter("name");
InputStream is = new FileInputStream(resourceLocatoin + name);
byte[] bs = new byte[2048];
int length = 0;
// 处理中文文件下载的时候,浏览器显示乱码的问题
String cnFileName = URLEncoder.encode(name, "utf-8");
// 下载需要设置头信息, 是一种固定的模式
resp.setHeader("Content-Disposition", "attachment; filename=" + cnFileName);
/**
* BufferedOutputStream 继承了 OutputStream
* ServletOutputStream 继承了 OutputStream
*
* LinkedList List
* ArrayList List
*/
ServletOutputStream servletOutputStream = resp.getOutputStream();
while(-1 != (length = is.read(bs))) {
servletOutputStream.write(bs, 0, length);
}
servletOutputStream.flush();
servletOutputStream.close();
is.close();
}
}
前端显示
上传页面前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- <video src="http://localhost/abc.mp4" width="600" height="400" autoplay/>-->
<!-- 1.文件的上传必须是post,因为post请求的数据是放在请求体中,可以携带大量的数据
2.第二步enctype必须是:多媒体的表单数据,文件的上传必须要这个参数。
-->
<form method="post" enctype="multipart/form-data" action="file">
File: <input type="file" name="avatar"><br>
<input type="submit">
</form>
</body>
</html>
下载代码前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
@WebServlet(value = "/download", name = "DownLoadServlet")
public class DownLoadServlet extends HttpServlet {
-->
<a href="download?name=0dc725b1-5b12-4865-bbd0-2fbed66b9e7e.png">0dc725b1-5b12-4865-bbd0-2fbed66b9e7e.png</a><br>
<a href="download?name=abc.mp4">abc.mp4</a><br>
<a href="download?name=8cb8b49a-dec3-4710-ab96-67b0cba47085.mp4">8cb8b49a-dec3-4710-ab96-67b0cba47085.mp4</a><br>
</body>
</html>
然后我们最终要来看看效果,要不然前面的都白看了。
于是乎
就有上传