2008-08-28 34 views
31

Cách tốt nhất để tải tệp lên Thư viện Tài liệu trên máy chủ SharePoint thông qua các dịch vụ web tích hợp mà phiên bản WSS 3.0 hiển thị là gì?Tải tệp lên SharePoint thông qua các dịch vụ web tích hợp

Tiếp nối hai câu trả lời ban đầu ...

  • Chúng tôi chắc chắn cần phải sử dụng các lớp dịch vụ Web như chúng ta sẽ làm cho các cuộc gọi từ các ứng dụng khách hàng từ xa.

  • Phương pháp WebDAV sẽ hoạt động với chúng tôi, nhưng chúng tôi muốn nhất quán với phương pháp tích hợp dịch vụ web.

Ngoài ra còn có dịch vụ web để tải lên tệp, đau đớn nhưng hoạt động mọi lúc.

Bạn đang đề cập đến dịch vụ "Sao chép"? Chúng tôi đã thành công với phương thức CopyIntoItems của dịch vụ này. Đây có phải là cách được khuyến nghị để tải tệp lên Thư viện Tài liệu bằng chỉ sử dụng API dịch vụ web WSS không?

Tôi đã đăng mã của chúng tôi làm câu trả lời được đề xuất.

Trả lời

17

Ví dụ về sử dụng dịch vụ Web WSS "Copy" để tải lên một tài liệu vào một thư viện ...

public static void UploadFile2007(string destinationUrl, byte[] fileData) 
{ 
    // List of desination Urls, Just one in this example. 
    string[] destinationUrls = { Uri.EscapeUriString(destinationUrl) }; 

    // Empty Field Information. This can be populated but not for this example. 
    SharePoint2007CopyService.FieldInformation information = new 
     SharePoint2007CopyService.FieldInformation(); 
    SharePoint2007CopyService.FieldInformation[] info = { information }; 

    // To receive the result Xml. 
    SharePoint2007CopyService.CopyResult[] result; 

    // Create the Copy web service instance configured from the web.config file. 
    SharePoint2007CopyService.CopySoapClient 
    CopyService2007 = new CopySoapClient("CopySoap"); 
    CopyService2007.ClientCredentials.Windows.ClientCredential = 
     CredentialCache.DefaultNetworkCredentials; 
    CopyService2007.ClientCredentials.Windows.AllowedImpersonationLevel = 
     System.Security.Principal.TokenImpersonationLevel.Delegation; 

    CopyService2007.CopyIntoItems(destinationUrl, destinationUrls, info, fileData, out result); 

    if (result[0].ErrorCode != SharePoint2007CopyService.CopyErrorCode.Success) 
    { 
     // ... 
    } 
} 
+0

Bạn đã tìm thấy bất kỳ vấn đề nào có lỗi khi tệp đã tồn tại chưa? Tôi bắt đầu sử dụng kỹ thuật này nhưng thấy rằng tôi liên tục nhận được lỗi "Không thể tạo mục tại đích được yêu cầu. Xác minh rằng thư mục tồn tại và bạn có quyền chỉnh sửa trong đó". Bất cứ ai khác có vấn đề này? – misteraidan

+1

CẬP NHẬT - nếu url đích giống với url bên trong các URL đích [], lỗi ở trên được ném nếu tệp/mục đã tồn tại .... (rant: tại sao chúng tôi không thể chỉnh sửa nhận xét ?!) – misteraidan

+0

Không, tôi không bao giờ có bất kỳ vấn đề như vậy. Đó là lỗi "điểm đến xấu" cổ điển của bạn, nhưng nếu bạn chắc chắn đích đến là chính xác và bạn có quyền, tôi không thể nghĩ điều gì khác có thể gây ra điều này. –

1

Từ một colleage tại nơi làm việc:

cách Lazy: Windows giao diện WebDAV hệ thống tập tin của bạn. Nó là xấu như một giải pháp có lập trình bởi vì nó dựa trên dịch vụ WindowsClient chạy trên hệ điều hành của bạn, và cũng chỉ hoạt động trên các trang web chạy trên cổng 80. Ánh xạ ổ đĩa vào thư viện tài liệu và nhận được sao chép tệp.

Ngoài ra còn có một dịch vụ web để tải lên các tệp, đau đớn nhưng hoạt động mọi lúc.

Tôi tin rằng bạn có thể tải tệp lên qua API FrontPage nhưng tôi không biết ai thực sự sử dụng nó.

+0

Word, Excel (và các ứng dụng Office khác) sử dụng API FrontPage cũng như nhiều ứng dụng khác. Trong phiên bản 2010, CMIS sẽ được hỗ trợ. –

1

Không chắc chắn về dịch vụ web nào sẽ sử dụng, nhưng nếu bạn ở vị trí nơi bạn có thể sử dụng tệp SharePoint .NET API, thì sử dụng SPList và SPLibrary.Items.Add thực sự dễ dàng.

+0

Không có ý tưởng tại sao điều này đã được upvoted: "Chúng tôi chắc chắn cần phải sử dụng lớp dịch vụ Web như chúng tôi sẽ thực hiện các cuộc gọi từ các ứng dụng máy khách từ xa." –

+0

@MichaelBlackburn Bởi vì nếu bạn nhìn vào lịch sử của câu hỏi, việc làm rõ đã không được thêm vào câu hỏi cho đến sau khi tôi đăng câu trả lời của mình. –

+0

Ah, tôi xin lỗi. –

9

một lựa chọn khác là sử dụng đồng bằng ol' HTTP PUT:

WebClient webclient = new WebClient(); 
webclient.Credentials = new NetworkCredential(_userName, _password, _domain); 
webclient.UploadFile(remoteFileURL, "PUT", FilePath); 
webclient.Dispose(); 

đâu điểm remoteFileURL vào thư viện tài liệu SharePoint của bạn ...

+0

Đồng ý với Erik E, sau đó cập nhật dữ liệu meta bạn cần tạo phiên bản khác (nơi phiên bản cho thư viện tài liệu được bật). Nếu bạn làm điều này, phiên bản đầu tiên sẽ là Phiên bản 2 (hoặc 0,2). – misteraidan

+1

Không chắc chắn điều này là đúng, vì tôi không nghĩ rằng "PUT" sẽ kiểm tra trong tập tin nếu phiên bản được kích hoạt. Ngoài ra, có thể cập nhật siêu dữ liệu mà không cần tạo phiên bản mới bằng cách sử dụng phương thức SPListItem.SystemUpdate() ... –

+2

Điều này có yêu cầu thay đổi quyền mặc định trong IIS không? Tôi nhận được ngoại lệ 403 Cấm khi thực hiện việc này. – Jeremy

8

Có một vài điều cần xem xét:

  • Copy.CopyIntoItems cần tài liệu để thể đã có mặt tại một số máy chủ .Tài liệu được chuyển như một tham số của cuộc gọi webservice, điều này sẽ giới hạn mức độ lớn của tài liệu. (Xem http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c)
  • các 'http đặt' phương pháp (ví dụ WebDAV ...) sẽ chỉ đưa tài liệu trong thư viện, nhưng không được thiết lập giá trị lĩnh vực
  • để cập nhật giá trị trường bạn có thể gọi Lists.UpdateListItem sau ' http đặt'
  • thư viện tài liệu có thể có các thư mục, bạn có thể làm cho họ với 'http mkcol'
  • bạn có thể muốn kiểm tra trong các tập tin với Lists.CheckInFile
  • bạn cũng có thể tạo một webservice tùy chỉnh sử dụng SPxxx. Net API, nhưng webservice mới sẽ phải được cài đặt trên máy chủ. Nó có thể lưu các chuyến đi đến máy chủ.
+1

Đối với CopyIntoItems, url nguồn chỉ là thông tin. Các bit không đến từ một số máy chủ khác. –

+0

Từ thử nghiệm của tôi ngày hôm nay, viên đạn số 1 là không chính xác. Bạn có thể tải lên một tài liệu hoàn toàn mới cho máy chủ với Copy.CopyIntoItems. – retrodrone

+1

Bạn chính xác. Tôi đã cập nhật câu trả lời, xin lưu ý vấn đề kích thước tối đa. –

6
public static void UploadFile(byte[] fileData) { 
    var copy = new Copy { 
    Url = "http://servername/sitename/_vti_bin/copy.asmx", 
    UseDefaultCredentials = true 
    }; 

    string destinationUrl = "http://servername/sitename/doclibrary/filename"; 
    string[] destinationUrls = {destinationUrl}; 

    var info1 = new FieldInformation 
       { 
        DisplayName = "Title", 
        InternalName = "Title", 
        Type = FieldType.Text, 
        Value = "New Title" 
       }; 

    FieldInformation[] info = {info1}; 
    var copyResult = new CopyResult(); 
    CopyResult[] copyResults = {copyResult}; 

    copy.CopyIntoItems(
    destinationUrl, destinationUrls, info, fileData, out copyResults); 
} 

LƯU Ý: Thay đổi các tham số 1 của CopyIntoItems với tên tập tin, Path.GetFileName(destinationUrl), làm cho thông điệp unlink biến mất.

Các vấn đề liên quan