C# 使用WebClient 或者 FileWebRequest 将文件传输到file协议(地址格式类似: file://192.168.111.11/file/)的远程服务器地址,Windows环境调试正常,部署到线上环境(Docker容器)发现,没有报错,远程服务器文件夹中没有传输成功,附加调试也未发现异常。
两种方式的写法如下:
- WebClient
var ftpPath = "file://192.168.111.11/FTPFile/filename.txt";
WebClient client = new WebClient();
client.Credentials = new NetworkCredential(username, password);
client.UploadFile(new Uri(ftpPath), filePath);
- FileWebRequest
// 创建FTP请求
var ftpPath = "file://192.168.111.11/FTPFile/filename.txt";
FileWebRequest ftpRequest = (FileWebRequest)WebRequest.Create(ftpPath);
ftpRequest.Credentials = new NetworkCredential(username, password);
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
// 上传文件
using (Stream ftpStream = ftpRequest.GetRequestStream())
using (FileStream fileStream = File.OpenRead(filePath))
{
fileStream.CopyTo(ftpStream);
}
在附加调试的时候发现FileWebRequest处理的时候,ftpStream的Name属性为/app\\\\192.168.111.11\FTPFile\filename.txt
由于/app为配置的docker容器的工作路径,在容器内部的app目录果然找到了 \\192.168.111.11\FTPFile\filename.txt
文件,gpt查询知道
在Docker容器中,
file://
协议将被解释为容器内部的本地路径,而不是宿主机的路径。这意味着如果你在Docker容器中使用file://
协议指向某个路径,该路径将被视为容器内部的路径,而不是宿主机上的路径。要访问宿主机上的文件,你需要将宿主机的文件挂载到容器中。在Docker中,可以通过
-v
或--volume
选项来挂载宿主机上的文件或目录到容器中。例如,你可以使用以下命令来运行一个带有挂载目录的容器:docker run -v /host/path:/container/path -it your_image
这将把宿主机上的
/host/path
目录挂载到容器内的/container/path
目录中。然后,在容器中,你可以使用/container/path
访问宿主机上的文件。因此,如果你想在Docker容器中使用
file://
协议访问宿主机上的文件,你需要首先将宿主机上的文件挂载到容器中。
后面准备试一试部署ftp服务器,使用ftp协议传输。