2011-05-21 31 views
2

我使用C#創建文件上傳服務上傳文件(大尺寸)。 我創建了三個方法: 我怎樣才能在IIS(Internt的信息服務)使用的FileStream在WebService的

  • upload_start(string filename)
  • upload_continue(string filename, byte[] buffer)
  • upload_end(string filename)
  • 它的工作原理,但我不希望從客戶端程序處理3種功能。如何從客戶端程序打開FileStream,並讓服務器端完成文件上傳?

    +0

    要啓動具有該文件從客戶端上傳,那麼服務器可以接管從客戶端讀取文件電腦?我試圖澄清你想要做什麼。 – 2011-05-21 03:46:30

    +0

    是的,我希望服務器保重一切。 – alex 2011-05-21 16:12:22

    回答

    0

    我不認爲你可以作爲的FileStream無法序列化。爲什麼不傳遞服務的文件名(就像你已經是這樣)並讓服務打開文件並處理它。

    +0

    但似乎我只能request.getInputStream讀取所有上傳的文件。
    我可以從Web服務的服務器端文件名,因爲該文件是在客戶端無法打開文件。 – alex 2011-05-21 14:31:11

    +0

    @alex - 服務器將無法訪問文件系統中的客戶機上,因爲這是別人願意利用一個令人難以置信的大量的安全漏洞。 – 2011-05-21 18:41:06

    0

    上傳的Web服務(而不是Windows Cominication基金會WCF),這是要走的路一個大文件:添加此XML和改變取決於最大的maxRequestLength的值

    在服務器端文件的Web.Config上傳的大小,defoult的maxRequestLength爲4MB,在這個例子中8192 = MB

    <httpRuntime 
         executionTimeout="600" 
         maxRequestLength="8192" 
         useFullyQualifiedRedirectUrl="false" 
         minFreeThreads="8" 
         minLocalRequestFreeThreads="4" 
         appRequestQueueLimit="100" 
         enableVersionHeader="true" 
        /> 
    

    添加其他公共職能在服務器端,這個函數接受一個byte []包含的文件,文件名和路徑,你不會將該文件保存在服務器中。

    public String UploadFile(byte[] fileByte, String fileName, String savePath) 
         { 
    
          string newPath = savePath; 
    
    
          if (!Directory.Exists(newPath)) 
          { 
           Directory.CreateDirectory(newPath); 
          } 
    
          newPath = newPath + fileName; 
    
          System.IO.FileStream fs1 = null; 
          byte[] b1 = null; 
          b1 = fileByte; 
          fs1 = new FileStream(newPath, FileMode.Create); 
          fs1.Write(b1, 0, b1.Length); 
          fs1.Flush(); 
          fs1.Close(); 
          fs1 = null; 
    
          return newPath; 
         } 
    

    在客戶端添加此代碼發送的文件:

    Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); 
          dlg.FileName = "Select a File"; 
          dlg.DefaultExt = ".xls"; 
          dlg.Filter = "Excel documents (.xls)|*.xls"; 
    
          // Show open file dialog box 
          Nullable<bool> result = dlg.ShowDialog(); 
    
          // Process open file dialog box results 
          if (result == true) 
          { 
    
           string filename = dlg.FileName; 
    
    
           string file = Path.GetFileName(filename); 
    
           System.IO.FileStream fs1 = null; 
           fs1 = System.IO.File.Open(filename, FileMode.Open, FileAccess.Read); 
           byte[] b1 = new byte[fs1.Length]; 
           fs1.Read(b1, 0, (int)fs1.Length); 
           fs1.Close(); 
    
    
           String savePath = @"C:\DOC\IMPORT\"; 
           String newPath = WEB_SERVICES.UploadFile(b1, file, savePath); 
    
    
           MessageBox.Show(String.Format("The file is uploaded in {0}", newPath)); 
    
    
          } 
          else 
          { 
           MessageBox.Show("Select a file, please"); 
          }