使用 webclient 类将文件上传到文件服务器

Posted

技术标签:

【中文标题】使用 webclient 类将文件上传到文件服务器【英文标题】:Uploading files to file server using webclient class 【发布时间】:2010-09-20 18:45:50 【问题描述】:

目前我有一个应用程序从我的网络应用程序接收上传的文件。我现在需要将该文件传输到恰好位于同一网络上的文件服务器(但可能并非总是如此)。

我试图在 C# .NET 中使用 webclient 类。

    string filePath = "C:\\test\\564.flv";
    try
    
        WebClient client = new WebClient();

        NetworkCredential nc = new NetworkCredential(uName, password);

        Uri addy = new Uri("\\\\192.168.1.28\\Files\\test.flv");
        client.Credentials = nc;
        byte[] arrReturn = client.UploadFile(addy, filePath);
        Console.WriteLine(arrReturn.ToString());
    
    catch (Exception ex)
    
        Console.WriteLine(ex.Message);
    

位于 192.168.1.28 的机器是一个文件服务器并且有一个共享 c:\Files。 截至目前,我收到登录失败的错误用户名或密码错误,但我可以打开资源管理器并成功输入该路径登录。我也可以使用远程桌面登录,所以我知道用户帐户有效。

关于这个错误的任何想法? 可以这样直接传输文件吗?使用 webclient 类或其他类?

【问题讨论】:

账号是域账号还是机器账号? 帐户是机器上的用户。问题是我们正在迁移到一个新的架构,我们有 2 个文件服务器集群并使用虚拟 IP 进行负载平衡。所以我需要能够将文件发送给 VIP。 我知道如果我发布到页面,使用 Web 客户端会起作用。但我想避免这种情况并直接传输文件。有没有办法做到这一点? 【参考方案1】:

随便用

File.Copy(filepath, "\\\\192.168.1.28\\Files");

通过 UNC 路径公开的 windows 文件共享被视为文件系统的一部分,与网络无关。

使用的凭据将是 ASP.NET 工作进程的凭据,或者您启用的任何模拟。如果您可以调整它们以使其正确,则可以做到。

您可能会遇到问题,因为您使用的是 IP 地址而不是服务器名称(Windows 信任设置会阻止离开域 - 通过使用 IP,您会隐藏任何域详细信息)。 如果可能,请使用服务器名称!

如果这不在同一个 windows 域中,并且您尝试使用不同的域帐户,则需要将用户名指定为“[domain_or_machine]\[username]”

如果您需要指定显式凭据,则需要查看 coding an impersonation solution。

【讨论】:

可能因为权限问题而无法使用。只有当他在具有所需权限的用户下运行网站时,他才能使用 System.IO.File.Copy。默认情况下,Web 应用程序在本地受限用户下运行,以避免安全问题。 添加了一些权限细节。同意 - 权限可能会变得棘手。 @TheSoftwareJedi 是否可以将文件传输到文件服务器而不存储在最初从网页上传文件的服务器上?【参考方案2】:

当您手动打开 IP 地址时(通过 RUN 命令或映射网络驱动器),您的 PC 将通过管道发送您的凭据,文件服务器将接收来自 DC 的授权。

当 ASP.Net 尝试时,它会尝试使用 IIS worker 用户(除非打开模拟,这会列出一些其他问题)。传统上,IIS 工作用户无权跨服务器工作(甚至在 Web 服务器上的其他文件夹中)。

【讨论】:

【参考方案3】:
namespace FileUpload

public partial class Form1 : Form

    string fileName = "";
    public Form1()
    
        InitializeComponent();
    

    private void button1_Click(object sender, EventArgs e)
    

        string path = "";
        OpenFileDialog fDialog = new OpenFileDialog();
        fDialog.Title = "Attach customer proposal document";
        fDialog.Filter = "Doc Files|*.doc|Docx File|*.docx|PDF doc|*.pdf";
        fDialog.InitialDirectory = @"C:\";
        if (fDialog.ShowDialog() == DialogResult.OK)
        
            fileName = System.IO.Path.GetFileName(fDialog.FileName);
            path = Path.GetDirectoryName(fDialog.FileName);
            textBox1.Text = path + "\\" + fileName;

        
    

    private void button2_Click(object sender, EventArgs e)
    
        try
        
            WebClient client = new WebClient();

            NetworkCredential nc = new NetworkCredential("erandika1986", "123");

            Uri addy = new Uri(@"\\192.168.2.4\UploadDocs\"+fileName);

            client.Credentials = nc;
            byte[] arrReturn = client.UploadFile(addy, textBox1.Text);
            MessageBox.Show(arrReturn.ToString());

        
        catch (Exception ex1)
        
            MessageBox.Show(ex1.Message);
        
    


【讨论】:

以上是关于使用 webclient 类将文件上传到文件服务器的主要内容,如果未能解决你的问题,请参考以下文章

[C#]使用WebClient上传文件并同时Post表单数据字段到服务端

将文件从 Azure 存储 blob 移动到 Ftp 服务器

如何使用GoogleServiceAuthentication类将文件上传到Grails中的google存储?

Spring Webflux上传大图像文件并以流式方式使用WebClient发送文件[关闭]

使用WebClient.OpenWrite 方法 (String, String)这个的时候出现了内存溢出

如何使用 .Net 4.0 中包含的 HttpClient 类将文件上传到在 IIS Express 中运行的 Asp.Net MVC 4.0 操作