苦苦研究三天,java 结合tomcat和nginx实现文件和图片上传和下载,告别404、403、500的网页错误

42 篇文章 0 订阅
10 篇文章 0 订阅

前言:

这三天里,因为之前没接触过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>

然后我们最终要来看看效果,要不然前面的都白看了。
于是乎
就有上传

在这里插入图片描述
在这里插入图片描述

下面我们来看一下下载的效果如何

在这里插入图片描述

虽然页面写得有点丑,但还是实现了上传了下载了,嘻嘻

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值