2008-11-04 141 views
9

目前我有一個應用程序從我的web應用程序接收上傳的文件。我現在需要將該文件傳輸到恰好位於同一網絡上的文件服務器(但這可能並非總是如此)。使用webclient上傳文件到文件服務器類

我試圖在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類或者其他一些類?

+0

是賬戶的域帳戶還是機器賬戶? – TheSoftwareJedi 2008-11-04 21:40:37

+0

該帳戶是機器上的用戶。問題是我們正在轉向新的體系結構,並且我們有兩個文件服務器通過虛擬IP進行羣集和負載平衡。所以我需要能夠將文件發送給VIP。 – JustLogic 2008-11-04 21:53:31

回答

16

只需使用

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

一個Windows文件共享通過UNC路徑暴露被作爲文件系統的一部分處理,並沒有任何與網絡。

使用的證書將是ASP.NET工作進程的證書或您啓用的任何模擬。如果你可以調整這些以使其正確,這可以完成。

您可能會遇到問題,因爲您使用的是IP地址而不是服務器名稱(Windows信任設置阻止離開域 - 通過使用IP您隱藏任何域詳細信息)。 如果可能,請使用服務器名稱!

如果不是在同一個Windows域,並且您嘗試使用不同的域帳戶,您將需要指定的用戶名是「[domain_or_machine] \ [用戶名]」

如果您需要要指定顯式憑證,您需要查看coding an impersonation solution

0

當您手動打開IP地址(通過RUN命令或映射網絡驅動器)時,您的PC將通過管道發送憑據,文件服務器將從DC接收授權。

當ASP.Net嘗試時,它將嘗試使用IIS工作者用戶(除非模擬打開,這將列出一些其他問題)。傳統上,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); 
     } 
    } 
} 
}