首页 > 其他分享 >文件下载时中文文件名乱码及链接失效问题解决

文件下载时中文文件名乱码及链接失效问题解决

时间:2024-04-11 20:22:05浏览次数:20  
标签:java 文件名 springframework 乱码 import apache org servlet 链接

问题:

报错提示
11-Apr-2024 15:38:43.792 信息 [Catalina-utility-2] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[G:\开发工作用软件\Java开发用\apache-tomcat-10.1.7\webapps\manager]的部署已在[293]毫秒内完成
11-Apr-2024 15:38:44.573 信息 [http-nio-8080-exec-4] org.springframework.web.servlet.FrameworkServlet.initServletBean Completed initialization in 1841 ms
11-Apr-2024 15:38:45.814 警告 [http-nio-8080-exec-5] org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass Using deprecated '-debug' fallback for parameter name resolution. Compile the affected code with '-parameters' instead or avoid its introspection: com.itbaizhan.controller.fileUploadAndDownload.FileDownload
11-Apr-2024 15:38:45.834 警告 [http-nio-8080-exec-5] org.apache.coyote.http11.Http11Processor.prepareResponse HTTP响应头信息[Content-Disposition] 值[attachment;filename=XML技术.png],由于无效已从响应中移除
	java.lang.IllegalArgumentException: 代码点[25,216]处的Unicode字符[技]无法编码,因为它超出了允许的0到255范围。
		at org.apache.tomcat.util.buf.MessageBytes.toBytesSimple(MessageBytes.java:290)
		at org.apache.tomcat.util.buf.MessageBytes.toBytes(MessageBytes.java:261)
		at org.apache.coyote.http11.Http11OutputBuffer.write(Http11OutputBuffer.java:389)
		at org.apache.coyote.http11.Http11OutputBuffer.sendHeader(Http11OutputBuffer.java:368)
		at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1049)
		at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:376)
		at org.apache.coyote.Response.action(Response.java:208)
		at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:187)
		at org.apache.coyote.Response.doWrite(Response.java:613)
		at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:334)
		at org.apache.catalina.connector.OutputBuffer.appendByteArray(OutputBuffer.java:750)
		at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:677)
		at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:382)
		at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:360)
		at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96)
		at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:89)
		at com.itbaizhan.controller.fileUploadAndDownload.FileDownload.getFile(FileDownload.java:46)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:568)
		at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
		at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
		at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
		at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:884)
		at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
		at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
		at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081)
		at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974)
		at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1011)
		at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)

原因:
通常windows操作系统默认采用GBK编码、浏览器请求和响应默认采用utf-8编码、Tomcat服务器内部默认iso-8859-1编码
浏览器处理响应时会默认将响应从iso-8859-1编码格式转换为utf-8编码格式

前端代码
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>可下载文件</title>
</head>
<body>
    <h1>请选择所需下载的文件</h1>
    <c:forEach items="${requestScope.fileList}" var="file">
        <a href="/file/getFile?fileName=${file}">${file}</a><br>
    </c:forEach>
</body>
</html>
修正前后端代码
package com.itbaizhan.controller.fileUploadAndDownload;

import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;


import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@Controller
@RequestMapping("/file")
public class FileDownload {

    //查询所有可下载文件
    @RequestMapping("/findFile")
    public String findFile(Model model){

        //1.获取可下载文件的路径集合。。注:跨服务器上传中,网络路径无法获取文件列表。
        String realPath = "H:\\myWorkspace\\springmvc\\mvc_demo1\\src\\main\\webapp\\img";
        File file = new File(realPath);
        String[] fileList = file.list();

        // 2.将路径集合放入Model中,跳转到JSP页面
        model.addAttribute("fileList",fileList);
        return "downloadableFiles";
    }

    //下载文件
    @RequestMapping("/getFile")
    public void getFile(HttpServletResponse response,String fileName) throws IOException {
        //设置响应头为文件下载
        response.setHeader("Content-Disposition","attachment;filename="+fileName);

        //获取文件路径
        String path = "H:\\myWorkspace\\springmvc\\mvc_demo1\\src\\main\\webapp\\img";

        File file = new File(path,fileName);

        //响应字符输出流
        ServletOutputStream os = response.getOutputStream();
        os.write(FileUtils.readFileToByteArray(file));
        os.flush();
        os.close();

    }

}

下载后文件 ![](/i/l/?n=24&i=blog/2066399/202404/2066399-20240411160218756-1106353699.jpg)
修正后后端代码
package com.itbaizhan.controller.fileUploadAndDownload;

import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;


import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

@Controller
@RequestMapping("/file")
public class FileDownload {

    //查询所有可下载文件
    @RequestMapping("/findFile")
    public String findFile(Model model){

        //1.获取可下载文件的路径集合。。注:跨服务器上传中,网络路径无法获取文件列表。
        String realPath = "H:\\myWorkspace\\springmvc\\mvc_demo1\\src\\main\\webapp\\img";
        File file = new File(realPath);
        String[] fileList = file.list();

        // 2.将路径集合放入Model中,跳转到JSP页面
        model.addAttribute("fileList",fileList);
        return "downloadableFiles";
    }

    //下载文件
    @RequestMapping("/getFile")
    public void getFile(HttpServletResponse response,String fileName) throws IOException {
        //设置响应头为文件下载
        //将请求的UTF-8编码格式中文文件名转为iso-8859-1编码格式
        response.setHeader("Content-Disposition","attachment;filename="+
                new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));

        //获取文件路径
        String path = "H:\\myWorkspace\\springmvc\\mvc_demo1\\src\\main\\webapp\\img";
        File file = new File(path,fileName);

        //响应字符输出流
        ServletOutputStream os = response.getOutputStream();
        os.write(FileUtils.readFileToByteArray(file));
        os.flush();
        os.close();
    }
}

下载后文件 ![](/i/l/?n=24&i=blog/2066399/202404/2066399-20240411160247909-1447872084.jpg)

标签:java,文件名,springframework,乱码,import,apache,org,servlet,链接
From: https://www.cnblogs.com/quhg/p/18129365

相关文章

  • 链接泄露隐私,通过分享链接反查账号
    你分享的链接泄露隐私了吗,一款可以通过分享链接反查账号的在线工具,用户输入分享的链接找到Ta的账号。平常在互联网上分享的帖子、笔记、视频、音乐等链接,会无意间泄露自己的个人账号,大多数应用在分享链接中使用身份追踪技术,包含你的账号信息,任何人都可以通过你分享的链接查询到......
  • 代码链接
    EncryptFile.sln#include"generic.h"#include<cstdio>#include<iostream>#include<string>#include<vector>usingnamespacestd;boolEncryptFile(conststring&strSource, conststring&strDestination, con......
  • windows MYSQL解决中文乱码问题
    windowsMYSQL解决中文乱码问题1.首先确保你已经把mysql配置了环境变量2.打开window终端3.输入mysql-uroot-p4.输入密码,就是安装的时候设置的root超级管理员权限密码5.输入:SHOWVARIABLESLIKE‘character%’; 出现上图,说明就会出现中文乱码问题。6.该怎么办呢,接......
  • 解决idea中Terminal终端无法执行GIT命令+Terminal 中文乱码
    参考文档:https://blog.csdn.net/qq_44830363/article/details/107096825 在使用IDEA进行开发的时候,经常会用到Git进行代码管理,如果再开一个Docker窗口的话,窗口切换来切换去的很不方便为了简单方便,我们可以直接在IDEA中使用自带的Terminal,这样就可以达到在IDEA主界......
  • Linux下的硬链接和软链接
    前言在Linux文件系统中,一个文件被分成两个部分:元数据(metadata)与用户数据(userdata)。元数据为文件的附加属性,如索引节点(Inode)、文件大小、文件创建时间、文件所有者等。元数据中并不包含文件名,文件名仅仅是为了方便用户使用。Linux文件系统为每一个保存在磁盘分区中的文件(无论......
  • 肖恩带你看C语言·编译和链接
    来咯来咯,又见面咯,看看编译和链接的知识,了解一下就好,不必深究~~~运行环境运行环境是指运行编译后的C语言程序所需的硬件和软件环境。硬件环境:包括CPU、内存、硬盘等物理设备,这些设备提供了程序运行所需的硬件资源。软件环境:主要是指操作系统和相关的库文件。操作系统提供......
  • 随手分享的APP链接,可能会让你“大型社死”
    早晨上班路上,你在地铁百无聊赖地刷着短视频,看到一则好笑的,随手分享给了你的公司“饭搭子”,并配上了一串“哈哈哈哈哈哈”。晚上下班路上你再次打开视频APP,发现首页弹窗给你推荐了一组“可能认识的人”,通过昵称你发现10个推荐里,7个都是你同事,其中一个正是你的“饭搭子”。你......
  • 交通规划四阶段法:基于 Python 的交通分布预测算法复现 - 附完整代码链接
    目录交通规划四阶段法:基于Python的交通分布预测算法复现-附完整代码链接我只是想使用这些代码下载代码文件代码的使用方法合作部分代码内容的展示交通规划四阶段法:基于Python的交通分布预测算法复现-附完整代码链接我这个学期有交通规划的课程。·交通规划四阶段法中第......
  • dotnet8中控制台应用中文乱码问题
    也许是因为系统是非中文,也许是LSTC修改版的系统,在dotnet8下开发控制台应用,出现了中文乱码显示问号的问题。经查阅,使用nuget包并设置中文编码,可解决。不知UTF-8编码是否也能正常显示中文,我没试。在项目内引用nuget包。<ItemGroup><PackageReferenceInclude="System.Te......
  • mvn test -Dtest 运行结果中文乱码
    问题:mvntest-Dtest运行结果中文乱码 解决方法:maven-complier-plugin中添加encoding设置 效果: ......