解决 Linux 和 Java 1.8 中上传中文名称图片报错问题

在 Linux 系统和 Java 1.8 中,当尝试上传含有中文名称的图片时,可能会遇到以下错误提示:

Caused by: java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: /home/uploadPath/2024/06/12/扣子蝴蝶型0_20240612085518A029.jpg at sun.nio.fs.UnixPath.encode(UnixPath.java:147) at sun.nio.fs.UnixPath.<init>(UnixPath.java:71) at sun.nio.fs.UnixFileSystem.getPath(UnixFil

为了解决这个问题,可以采取以下方法:

解决方法:添加启动参数 -Dfile.encoding=utf-8
Docker 部署:

在 Docker 的 ENTRYPOINT 中添加如下参数:

Dockerfile

ENTRYPOINT ["java","-Dfile.encoding=utf-8","-Duser.timezone=GMT+08","-Dspring.profiles.active=prod","-jar","app.jar"]

Linux 环境:

使用以下命令启动 Java 程序,添加 -Dfile.encoding=utf-8 参数:

nohup java -Dfile.encoding=utf-8 -jar app.jar --spring.profiles.active=prod >catalina.out 2>&1 &

通过以上配置,确保了在启动 Java 程序时,使用了 UTF-8 编码,这样可以正确处理含有中文名称的文件,避免了报错问题的发生。

3.5

### SCP命令权限不足导致的'Permission denied'解决方案 在使用SCP命令复制文件时,如果目标路径为`/usr/local/java/jdk1.8`并出现`Permission denied`误,通常是因为目标目录或其父目录的权限不足。以下是解决问题的具体方法: #### 1. 检查目标路径权限 确保目标路径`/usr/local/java/jdk1.8`及其所有父目录具有正确的权限。可以通过以下命令检查权限: ```bash ls -ld /usr/local/java/jdk1.8 ``` 如果权限不足,可以使用`chmod`命令更改权限。例如,将目标目录设置为可写入: ```bash sudo chmod 755 /usr/local/java/jdk1.8 ``` 此外,还需要确保父目录`/usr/local/java``/usr/local`也具有适当的权限[^3]。 #### 2. 修改目标路径的所有者 如果当前用户对目标路径没有写权限,可以更改目标路径的所有者为当前用户。例如: ```bash sudo chown $USER:$USER /usr/local/java/jdk1.8 ``` 这将使当前用户成为目标路径的所有者,从而获得写权限[^3]。 #### 3. 使用`root`用户进行输 如果上述方法不可行,可以尝试以`root`用户身份执行SCP命令。首先,在服务器端修改SSH配置文件以允许`root`用户登录: ```bash sudo vim /etc/ssh/sshd_config ``` 找到`PermitRootLogin`选项,并将其设置为`yes`: ```plaintext PermitRootLogin yes ``` 保存后重启SSH服务: ```bash sudo systemctl restart sshd ``` 然后以`root`用户身份执行SCP命令: ```bash scp -r source_file root@remote_host:/usr/local/java/jdk1.8 ``` 注意:出于安全考虑,建议在完成输后将`PermitRootLogin`重新设置为`no`[^1]。 #### 4. 更改目标路径 如果无法修改目标路径的权限或所有者,可以选择将文件复制到其他具有写权限的目录,然后再移动到目标路径。例如: ```bash scp source_file remote_user@remote_host:/home/remote_user/ ssh remote_user@remote_host "sudo mv /home/remote_user/source_file /usr/local/java/jdk1.8/" ``` #### 5. 验证目标路径是否存在 确保目标路径`/usr/local/java/jdk1.8`已经存在。如果不存在,可以先创建该路径: ```bash ssh remote_user@remote_host "sudo mkdir -p /usr/local/java/jdk1.8 && sudo chmod 755 /usr/local/java/jdk1.8" ``` ### 示例代码 以下是一个完整的SCP命令示例,假设需要将本地文件`jdk-8u291-linux-x64.tar.gz`复制到远程服务器的`/usr/local/java/jdk1.8`目录: ```bash # 修改远程服务器SSH配置以允许root登录 ssh root@remote_host "sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config && systemctl restart sshd" # 执行SCP命令 scp jdk-8u291-linux-x64.tar.gz root@remote_host:/usr/local/java/jdk1.8/ # 复制完成后恢复SSH配置 ssh root@remote_host "sed -i 's/PermitRootLogin yes/PermitRootLogin prohibit-password/g' /etc/ssh/sshd_config && systemctl restart sshd" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值