我正在将我们的 .net core(2.1) API 从 IIS 移动到 GCP 中 kubernetes 中的 linux 容器,并且当文件名包含非 ASCII 字符时,从挂载的文件服务器中检索文件时遇到了一些问题。与此 GitHub issue类似,但这些是标准 UTF8 字符。奥奥
var di = new DirectoryInfo(directory);
if (di.Exists)
{
var dFiles = di.GetFiles("*.pdf", SearchOption.TopDirectoryOnly);
Log.Information($"Files found in {di.Name} : {string.Join(",", dFiles.Select(f => f.Name))}");
//Log.Information($"Length of files found in {di.Name} : {string.Join(",", dFiles.Select(f => f.Length))}");
files.AddRange(dFiles);
}
bost�der.pdf
被返回,但它应该是bostäder.pdf
.
在所有其他情况下,字符被正确处理,例如从数据库中读取。只有在读取文件名时才会出现问题。我FileNotFoundException
在尝试读取这些文件的长度时得到一个。LastWriteTime 返回 1601-01-01。
该文件位于 GCP 文件存储中,并使用 PersistentVolume 和 PersistentVolumeClaim 安装到 kubernetes 集群,然后安装到容器中。
运行此方法时,我尝试更改当前线程文化,但没有运气。相同的代码在使用符号链接指向文件共享的 windows/IIS 版本上运行良好。
如果我直接使用 new FileInfo 给出文件的路径,而不是DirectoryInfo.GetFiles
生成的 FileInfo 对象返回正确编码的文件名,尽管该FileInfo.Length
方法仍然会导致FileNotFoundException
.
使用过多个 Docker 镜像
- mcr.microsoft.com/dotnet/core/aspnet:2.1-bionic
- mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim
也尝试过设置
ENV LC_ALL=sv_SE.UTF-8 \
LANG=sv_SE.UTF-8
在 Dockerfile 中没有运气。有什么想法我还能尝试吗?
编辑:
我现在进行了进一步调查,问题不在于 .net,而在于 pod 上安装的驱动器。使用 ls 可以正确显示本地文件,但挂载上的文件不是。所以它似乎与驱动器的安装方式有关。我有一个persistantvolume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: fileserver
spec:
capacity:
storage: 1T
accessModes:
- ReadWriteMany
nfs:
path: /mymount
server: 1.2.3.4
和一个持久的volumeclaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fileserver-claim
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 1T
使用它安装到我的吊舱
volumeMounts:
- mountPath: /mnt/fileserver
name: pvc
和
volumes:
- name: pvc
persistentVolumeClaim:
claimName: fileserver-claim
readOnly: false
在我的 deployment.yaml
编辑2:
似乎是 Cloud Filestore 仅支持 NFSv3 的问题 - 有什么方法可以使用 NFSv3 读取这些文件