Windows 上创建的文件,上传到 Linux 服务器,文件名乱码?

Posted CSDN云计算

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows 上创建的文件,上传到 Linux 服务器,文件名乱码?相关的知识,希望对你有一定的参考价值。

作者 | 刘光录

来源 | TIAP

先来说一下问题,在 Windows 下创建的一系列文件,上传到 Linux 服务器后,出现文件名乱码,导致文件无法读取的情况。

事情的起因是这样的...

最近有这样一个需求:在Java Web工程中读取本地某一个文件夹(固定路径,写在配置文件中)下的所有文件,然后将其导入到系统中。最直接的方案就是使用java.io.File的listFiles方法列出这个文件夹中的所有文件,然后在做处理,我们也是这样做的。

在本地测试没有任何问题,但是一旦部署到生产环境(Linux系统环境),问题就来了:由于文件是通过FTP上传到固定文件夹中的,所以有一些中文名称的文件,在上传到Linux系统中后,就出现了乱码,程序也无法读取到。

于是开始检查tomcat编码、操作系统编码格式,都统一设置为UTF-8。

Tomcat:

catalina.sh中添加:export LANG=zh_CN.UTF-8

Linux 服务器编码:

vi /etc/sysconfig/i18nLANG="zh_CN.UTF-8"

注:检查操作系统编码命令为echo $LANG。查看操作系统语言命令:locale

统一编码后,问题依然存在。这时候才意识到,由于文件是在windows下生成的,默认编码都是gbk,所以需要将文件名称转码。

使用 convmv 将文件名转码

将文件名称转码,需要用到 convmv,这是一个转码工具。

在线安装 convmv

Linux中安装命令如下:

yum install convmv

如果系统没有联网,或者屏蔽了yum命令,可以先下载程序包,然后安装。

使用程序包安装步骤

1)下载

下载地址为:https://pkgs.org/download/convmv

根据操作系统版本选择相应的版本下载:

找到下载地址:

2)安装

将文件拷贝到一个路径下(比如home),执行安装命令:

sudo rpm -ivh convmv-1.15-2.el7.noarch.rpm

使用 convmv 对中文文件名进行转码

安装完 convmv 之后,就可使用 convmv 转码中文文件名了。为了操作方便,可写一个shell脚本,将文件名称转码:

#!/bin/bash
convmv -f gbk -t utf-8 -r --notest /opt/ftp

上述命令,是将 /opt/ftp 路径下的所有文件名,都统一转码为utf8。

这样中文名称的文件就能被程序读取到了。

在 Java Web 工程中应用的时候,每次有新文件上传,就手动执行一下上述shell脚本,显然是不现实的,所以最简单的方法,就是使用 Java 调用 shell 脚本,让其自动转码。

Java 调用 shell 脚本的代码如下:

List<String> commend = new ArrayList<String>();
commend.add("convmv");
commend.add("-f");
commend.add("gbk");
commend.add("-t");
commend.add("utf-8");
commend.add("-r");
commend.add("--notest");
commend.add("/opt/ftp");
try
    ProcessBuilder builder = new ProcessBuilder();
    builder.command(commend);
    Process proc = builder.start();
    proc.waitFor();
catch(Exception e)
    e.printStackTrace();

至此,问题解决。

以上就是本次分享全部内容,欢迎讨论。

往期推荐

redis + lua实现分布式接口限流实现方案

剖析 kubernetes 集群内部 DNS 解析原理

Docker 镜像和容器的导入导出及常用命令

如何从 Docker 镜像里提取 dockerfile!

点分享

点收藏

点点赞

点在看

以上是关于Windows 上创建的文件,上传到 Linux 服务器,文件名乱码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 使用 FTP 上传文件到 Linux 服务器上

Xshell实现Windows上传文件到Linux主机

windows上传文件到 linux的hdfs

《如何将windows上的软件包或文件上传到linux服务上》

在Windows上通过Xshell将文件上传到Linux上

linux 如何共享文件夹给 windows 访问,并能上传文件到共享文件夹