Tomcat文件上传及下载

文章目录

    • 第一部分:安装和配置Tomcat环境
      • [1. 安装Java环境(JDK 1.8)](#1. 安装Java环境(JDK 1.8))
      • [2. 下载并安装Tomcat](#2. 下载并安装Tomcat)
      • [3. 配置防火墙](#3. 配置防火墙)
    • 第二部分:解决中文乱码问题
      • [1. 修改Tomcat日志编码配置](#1. 修改Tomcat日志编码配置)
      • [2. 修改Tomcat服务器配置](#2. 修改Tomcat服务器配置)
      • [3. 确保系统环境支持UTF-8](#3. 确保系统环境支持UTF-8)
      • [4. 验证中文编码设置](#4. 验证中文编码设置)
    • 第三部分:创建文件上传下载功能的Web应用
      • [1. 创建项目结构](#1. 创建项目结构)
      • [2. 创建文件上传和下载的Servlet](#2. 创建文件上传和下载的Servlet)
      • [3. 创建web.xml文件](#3. 创建web.xml文件)
      • [4. 创建index.html文件](#4. 创建index.html文件)
      • [5. 创建必要的目录结构](#5. 创建必要的目录结构)
    • 第四部分:构建并部署应用
      • [1. 安装Maven](#1. 安装Maven)
      • [2. 创建pom.xml文件](#2. 创建pom.xml文件)
      • [3. 构建WAR文件](#3. 构建WAR文件)
      • [4. 部署WAR文件到Tomcat](#4. 部署WAR文件到Tomcat)
    • 第五部分:测试文件上传下载功能

以下是在 Tencentos/CentOS7/RedHat8系统上部署支持文件上传下载功能的Tomcat应用

第一部分:安装和配置Tomcat环境

1. 安装Java环境(JDK 1.8)

bash 复制代码
# 检查是否已安装Java
java -version

# 如果未安装,安装OpenJDK 1.8
sudo yum install -y java-1.8.0-openjdk-devel

# 验证Java安装
java -version

2. 下载并安装Tomcat

bash 复制代码
# 创建Tomcat目录
sudo mkdir -p /opt/tomcat

# 下载Tomcat 9(最新稳定版)
cd /opt/tomcat
sudo wget https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.97/bin/apache-tomcat-9.0.97.tar.gz

# 解压Tomcat
sudo tar xzvf apache-tomcat-9.0.97.tar.gz

# 重命名目录
sudo mv apache-tomcat-9.0.97.tar.gz tomcat

# 创建Tomcat服务脚本(用于开机自启动)
sudo tee /etc/systemd/system/tomcat.service <<EOF
[Unit]
Description=Apache Tomcat 9 Servlet Container
After=syslog.target network.target

[Service]
User=root
Group=root
Type=forking
Environment=CATALINA_PID=/opt/tomcat/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat/tomcat
Environment=CATALINA_BASE=/opt/tomcat/tomcat
ExecStart=/opt/tomcat/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/tomcat/bin/shutdown.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

# 重新加载systemd配置
sudo systemctl daemon-reload

# 启动Tomcat服务
sudo systemctl start tomcat

# 设置开机自启动
sudo systemctl enable tomcat

3. 配置防火墙

  • 如已关闭防火墙,此步忽略
bash 复制代码
# 开放Tomcat默认端口8080
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

第二部分:解决中文乱码问题

1. 修改Tomcat日志编码配置

bash 复制代码
# 编辑Tomcat的logging.properties文件
sudo vi /opt/tomcat/tomcat/conf/logging.properties

在文件中找到并修改以下行:

properties 复制代码
# 将UTF-8设置为UTF-8,确保日志输出使用UTF-8编码
java.util.logging.ConsoleHandler.encoding = UTF-8

如果找不到该行,就添加它。

2. 修改Tomcat服务器配置

bash 复制代码
# 编辑Tomcat的server.xml文件
sudo vi /opt/tomcat/tomcat/conf/server.xml

在``标签中添加URIEncoding="UTF-8"属性:

xml 复制代码
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8" />

3. 确保系统环境支持UTF-8

bash 复制代码
# 检查系统默认编码
locale

# 如果系统不是UTF-8,需要设置为UTF-8
# 编辑系统环境配置
sudo vi /etc/locale.conf

# 将内容修改为:
LANG=en_US.UTF-8

# 重新加载环境变量
sudo locale-gen
sudo update-locale

4. 验证中文编码设置

bash 复制代码
# 重新启动Tomcat
sudo systemctl restart tomcat

第三部分:创建文件上传下载功能的Web应用

1. 创建项目结构

bash 复制代码
# 创建项目目录
mkdir -p ~/file-upload-download
cd ~/file-upload-download

# 创建必要的目录结构
mkdir -p src/main/java/com/example/fileupload
mkdir -p src/main/webapp/WEB-INF

2. 创建文件上传和下载的Servlet

创建src/main/java/com/example/fileupload/FileUploadServlet.java:

java 复制代码
package com.example.fileupload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Paths;
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;

@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final String UPLOAD_DIR = "/opt/tomcat/tomcat/webapps/file_upload/downloads";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应编码为UTF-8
        response.setContentType("text/html; charset=UTF-8");
        
        response.getWriter().println("<html><head><meta charset=\"UTF-8\"></head><body>");
        response.getWriter().println("<h2>文件上传</h2>");
        response.getWriter().println("<form method='post' enctype='multipart/form-data' action='upload'>");
        response.getWriter().println("选择文件: <input type='file' name='file' /><br>");
        response.getWriter().println("<input type='submit' value='上传' />");
        response.getWriter().println("</form>");
        response.getWriter().println("<h2>文件下载</h2>");
        response.getWriter().println("<ul>");
        File dir = new File(UPLOAD_DIR);
        for (File file : dir.listFiles()) {
            if (file.isFile()) {
                response.getWriter().println("<li><a href='download?file=" + file.getName() + "'>" + file.getName() + "</a></li>");
            }
        }
        response.getWriter().println("</ul>");
        response.getWriter().println("</body></html>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求编码为UTF-8
        request.setCharacterEncoding("UTF-8");
        
        Part filePart = request.getPart("file");
        String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
        
        // 确保上传目录存在
        File uploadDir = new File(UPLOAD_DIR);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();
        }
        
        // 保存文件
        InputStream fileInputStream = filePart.getInputStream();
        OutputStream out = new FileOutputStream(UPLOAD_DIR + "/" + fileName);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = fileInputStream.read(buffer)) != -1) {
            out.write(buffer, 0, bytesRead);
        }
        out.close();
        fileInputStream.close();
        
        // 重定向回上传页面
        response.sendRedirect("upload");
    }
}

创建src/main/java/com/example/fileupload/FileDownloadServlet.java:

java 复制代码
package com.example.fileupload;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final String DOWNLOAD_DIR = "/opt/tomcat/tomcat/webapps/file_upload/downloads";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求和响应编码为UTF-8
        request.setCharacterEncoding("UTF-8");
        response.setContentType("application/octet-stream; charset=UTF-8");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + request.getParameter("file") + "\"");
        
        String fileName = request.getParameter("file");
        if (fileName == null || fileName.isEmpty()) {
            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "文件名不能为空");
            return;
        }
        
        // 构建文件路径
        File file = new File(DOWNLOAD_DIR, fileName);
        
        if (!file.exists() || !file.isFile()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "文件不存在");
            return;
        }
        
        // 读取文件并写入响应
        FileInputStream fis = new FileInputStream(file);
        OutputStream os = response.getOutputStream();
        
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = fis.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        
        fis.close();
        os.flush();
        os.close();
    }
}

3. 创建web.xml文件

src/main/webapp/WEB-INF目录下创建web.xml:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

4. 创建index.html文件

src/main/webapp目录下创建index.html:

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传下载</title>
</head>
<body>
    <h1>文件上传下载应用</h1>
    <p>点击 <a href="upload">这里</a> 进行文件上传和下载</p>
</body>
</html>

5. 创建必要的目录结构

bash 复制代码
# 创建下载目录
sudo mkdir -p /opt/tomcat/tomcat/webapps/file_upload/downloads
# 设置目录权限
sudo chown -R root:root /opt/tomcat/tomcat/webapps/file_upload/downloads

第四部分:构建并部署应用

1. 安装Maven

bash 复制代码
# 安装Maven
sudo yum install -y maven

2. 创建pom.xml文件

在项目根目录(/root/file-upload-download)创建pom.xml:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>file-upload-download</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
    
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <finalName>file_upload</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3. 构建WAR文件

bash 复制代码
cd /root/file-upload-download
mvn clean package

4. 部署WAR文件到Tomcat

bash 复制代码
# 将生成的WAR文件复制到Tomcat的webapps目录
sudo cp target/file_upload.war /opt/tomcat/tomcat/webapps/

# Tomcat会自动解压并部署应用

第五部分:测试文件上传下载功能

  1. 确保Tomcat正在运行:

    bash 复制代码
    sudo systemctl status tomcat
  2. 在浏览器中访问:

    复制代码
    http://192.168.100.146:8080/file_upload

    或者

    复制代码
    http://192.168.100.146:8080/file_upload/upload
  3. 上传文件:

    • 在上传页面选择一个中文命名的文件并点击"上传"
    • 上传成功后,页面会自动刷新
  4. 下载文件:

    • 在上传页面的文件列表中,点击中文文件名进行下载
相关推荐
艾莉丝努力练剑2 小时前
艾莉丝努力练剑的2025年度总结
java·大数据·linux·开发语言·c++·人工智能·python
鸽鸽程序猿4 小时前
【JavaEE】【SpringCloud】环境与工程搭建
java·spring cloud·java-ee
我居然是兔子10 小时前
异常练习:在试错中吃透Java异常处理的底层逻辑
java·开发语言
CC.GG11 小时前
【C++】STL容器----unordered_map和unordered_set的使用
java·数据库·c++
Overt0p12 小时前
抽奖系统(4)
java·spring boot·tomcat
想做后端的小C13 小时前
Java:接口回调
java·开发语言·接口回调
爱学习的小可爱卢13 小时前
JavaEE进阶——Spring核心设计模式深度剖析
java·spring·设计模式
毕设源码-钟学长13 小时前
【开题答辩全过程】以 个性化电影推荐网站的设计与实现为例,包含答辩的问题和答案
java·spring boot
C++业余爱好者14 小时前
Power Job 快速搭建 及通信机制介绍
java