2012-04-24 108 views
2

我無法將大文件上傳到Sharepoint 2010.我正在使用Visual Studio 2010和Language C#。我嘗試了多種方式從我在網上找到的內容,但沒有任何工作。我已將設置和配置文件更改爲允許的最大上傳限制,但仍然沒有任何內容。我正在使用可以正常工作的小文件的copy.asmx文件,並且在文件太大並且引發異常但嘗試失敗時嘗試UploadDataAsync。請看下面的代碼...通過c#Web服務將大文件上傳到Sharepoint 2010大文件

任何/所有的援助非常感謝。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace ListsService 
{ 

    public class UploadDocumentcs 
    { 
     public string UploadResult { get; set; } 
     public string Errors { get; set; } 
     public UploadDataCompletedEventHandler WebClient_UploadDataCompleted { get; set; } 
     public byte[] content { get; set; } 

     public void UploadDocumentToSP(string localFile, string remoteFile) 
     { 
      string result = string.Empty; 
      SPCopyService.CopySoapClient client = new SPCopyService.CopySoapClient(); 

      string sUser = "user"; 
      string sPwd = "pwd"; 
      string sDomain = "dmn"; 
      System.Net.NetworkCredential NC = new System.Net.NetworkCredential(sUser, sPwd, sDomain); 

      client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
      client.ClientCredentials.Windows.ClientCredential = NC; 

      try 
      { 
       client.Open(); 

       string url = "http://SP/TestLibrary/"; 
       string fileName = localFile.Substring(localFile.LastIndexOf('\\'), (localFile.Length - localFile.LastIndexOf('\\'))); 
       fileName = fileName.Remove(0, 1); 
       string[] destinationUrl = { url + fileName }; 

       System.IO.FileStream fileStream = new System.IO.FileStream(localFile, System.IO.FileMode.Open); 
       byte[] content = new byte[(int)fileStream.Length]; 
       fileStream.Read(content, 0, (int)fileStream.Length); 
       fileStream.Close(); 

       // Description Information Field 
       SPCopyService.FieldInformation descInfo = new SPCopyService.FieldInformation 
                { 
                 DisplayName = "Description", 
                 Type = SPCopyService.FieldType.File, 
                 Value = "Test file for upload" 
                }; 

       SPCopyService.FieldInformation[] fileInfoArray = { descInfo }; 

       SPCopyService.CopyResult[] arrayOfResults; 

       uint result2 = client.CopyIntoItems(fileName, destinationUrl, fileInfoArray, content, out arrayOfResults);     

       // Check for Errors 
       foreach (SPCopyService.CopyResult copyResult in arrayOfResults) 
       { 
        string msg = "====================================" + 
            "SharePoint Error:" + 
            "\nUrl: " + copyResult.DestinationUrl + 
            "\nError Code: " + copyResult.ErrorCode + 
            "\nMessage: " + copyResult.ErrorMessage + 
            "===================================="; 


        Errors = string.Format("{0};{1}", Errors, msg); 
       } 
       UploadResult = "File uploaded successfully"; 

      } 
      catch (OutOfMemoryException) 
      { 
       System.Uri uri = new Uri("http://bis-dev-srv2:300/DNATestLibrary/"); 
       (new System.Net.WebClient()).UploadDataCompleted += new UploadDataCompletedEventHandler(WebClient_UploadDataCompleted); 
       (new System.Net.WebClient()).UploadDataAsync(uri, content); 

      } 

      finally 
      { 
       if (client.State == System.ServiceModel.CommunicationState.Faulted) 
       { 
        client.Abort(); 
        UploadResult = "Upload aborted due to error"; 
       } 

       if (client.State != System.ServiceModel.CommunicationState.Closed) 
       { 
        client.Close(); 
       } 
      } 
     } 


     void WcUpload_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e) 
     { 

      if (e != null) 
      { 
       UploadResult = "Upload Unuccessful"; 
      } 
      else 
      { 
       UploadResult = "Upload Successful"; 
       //throw new NotImplementedException(); 
      } 
     } 
    } 
} 

回答

1
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.IO; 
namespace UploadTester 
{ 
    public partial class frmMain : Form 
    { 
     public frmMain() 
     { 
      InitializeComponent(); 
     } 

     private void btnSelectFile_Click(object sender, EventArgs e) 
     { 
      openFileDialog1.ShowDialog(); 
      textBox1.Text = openFileDialog1.FileName; 
     } 

     private void btnUpload_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       byte[] content = GetByteArray(); 
       string filename = Path.GetFileName(openFileDialog1.FileName); 

       System.Net.WebClient webClient = new System.Net.WebClient(); 
       System.Uri uri = new Uri("http://SP/DNATestLibrary/" + filename); 
       webClient.Credentials = new NetworkCredential("username", "pwd", "domain"); 

       webClient.UploadData(uri, "PUT", content); 

       MessageBox.Show("Upload Successful"); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     byte[] GetByteArray() 
     { 
      FileStream fileStream = new System.IO.FileStream(openFileDialog1.FileName, System.IO.FileMode.Open); 
      byte[] content = new byte[(int)fileStream.Length]; 
      fileStream.Read(content, 0, (int)fileStream.Length); 
      fileStream.Close(); 

      return content; 
     } 

     private void btnUploadAsync_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       byte[] content = GetByteArray(); 
       string filename = Path.GetFileName(openFileDialog1.FileName); 

       System.Net.WebClient webClient = new System.Net.WebClient(); 
       System.Uri uri = new Uri("http://SP/DNATestLibrary/" + filename); 

       webClient.UploadDataCompleted += new UploadDataCompletedEventHandler(webClient_UploadDataCompleted); 
       webClient.Credentials = new NetworkCredential("username", "pwd", "domain"); 

       webClient.UploadDataAsync(uri, "PUT", content); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

     void webClient_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e) 
     { 
      if (e.Error == null) 
      { 
       MessageBox.Show("Upload Successful"); 
      } 
      else 
      { 
       MessageBox.Show(e.ToString()); 
      } 

     } 
    } 
} 
2

肖恩
爲了得到這個工作,你將不得不更改SharePoint配置以增加上傳限制和超時。下面的鏈接顯示了獲取大文件上傳的必要步驟。

http://blogs.technet.com/b/sharepointcomic/archive/2010/02/14/sharepoint-large-file-upload-configuration.aspx

+0

感謝毗溼奴,我已經做到了,但它並沒有幫助。我發現了另一種使用UploadData以及UploadDataAsync的方法,如下所示,似乎正在工作。 – 2012-04-25 08:08:19