2008-08-28 13 views
31

अंतर्निहित वेब सेवाओं के माध्यम से एक SharePoint सर्वर पर दस्तावेज़ लाइब्रेरी में फ़ाइल अपलोड करने का सबसे अच्छा तरीका क्या है जो संस्करण WSS 3.0 खुलासा करता है?बिल्ट-इन वेब सेवाओं के माध्यम से शेयरपॉइंट पर एक फ़ाइल अपलोड करें

दो प्रारंभिक जवाब के बाद ...

  • हम निश्चित रूप से वेब सेवा स्तर का उपयोग करने के रूप में हम दूरस्थ क्लाइंट अनुप्रयोग से इन कॉल करने दिया जाएगा की जरूरत है।

  • वेबएडीवी विधि हमारे लिए काम करेगी, लेकिन हम वेब सेवा एकीकरण विधि के अनुरूप होना पसंद करेंगे।

वहाँ अतिरिक्त, फ़ाइलों को अपलोड करने के लिए वेब सेवा है दर्दनाक लेकिन हर समय काम करता है।

क्या आप "कॉपी" सेवा का जिक्र कर रहे हैं? हम इस सेवा की CopyIntoItems विधि के साथ सफल रहे हैं। क्या यह केवल WSS वेब सेवा API का उपयोग करके दस्तावेज़ पुस्तकालयों में फ़ाइल अपलोड करने का अनुशंसित तरीका होगा?

मैंने अपना कोड एक सुझाए गए उत्तर के रूप में पोस्ट किया है।

उत्तर

17
एक पुस्तकालय के लिए एक दस्तावेज़ अपलोड करने WSS "कॉपी" वेब सेवा का उपयोग करने का

उदाहरण ...

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

क्या फ़ाइल पहले से मौजूद है जब आपको त्रुटियों के साथ कोई समस्या मिली है? मैंने इस तकनीक का उपयोग शुरू किया लेकिन पाया कि मुझे लगातार एक त्रुटि मिली है "अनुरोधित गंतव्य पर कोई आइटम नहीं बना सकता। सत्यापित करें कि फ़ोल्डर मौजूद है और आपके पास इसे संपादित करने की अनुमति है"। क्या किसी को भी यह समस्या हुई थी? – misteraidan

+1

अद्यतन - यदि गंतव्य यूआरएल गंतव्य यूआरएलएस [] के अंदर यूआरएल जैसा ही है, तो उपरोक्त त्रुटि फेंक दी गई है अगर फ़ाइल/आइटम पहले से मौजूद है .... (रंट: हम टिप्पणियां क्यों संपादित नहीं कर सकते हैं ?!) – misteraidan

+0

नहीं, मैं ऐसी कोई समस्या नहीं थी। यह आपकी क्लासिक "खराब गंतव्य" त्रुटि है, लेकिन यदि आप सुनिश्चित हैं कि गंतव्य सही है और आपके पास अनुमति है, तो मैं नहीं सोच सकता कि यह और क्या हो सकता है। –

1

काम पर एक colleage से:

लेज़ी तरीका: अपने Windows WebDAV फाइल सिस्टम इंटरफ़ेस। यह एक प्रोग्रामेटिक समाधान के रूप में बुरा है क्योंकि यह आपके ओएस पर चल रहे विंडोज क्लाइंट सेवा पर निर्भर करता है, और यह केवल पोर्ट 80 पर चल रही वेबसाइटों पर काम करता है। दस्तावेज़ लाइब्रेरी में ड्राइव करें और फ़ाइल कॉपीिंग के साथ प्राप्त करें।

अतिरिक्त रूप से फ़ाइलों को अपलोड करने के लिए एक वेब सेवा है, दर्दनाक लेकिन हर समय काम करता है।

मुझे विश्वास है कि आप FrontPage API के माध्यम से फ़ाइलों को अपलोड करने में सक्षम हैं लेकिन मुझे वास्तव में इसका उपयोग करने वाले किसी भी व्यक्ति के बारे में पता नहीं है।

+0

वर्ड, एक्सेल (और अन्य ऑफिस ऐप्स) फ्रंटपेज एपीआई का उपयोग कई अन्य लोगों के रूप में करते हैं। 2010 के संस्करण में सीएमआईएस का समर्थन किया जाएगा। –

1
नहीं

पर यकीन है कि वास्तव में कौन-वेब सेवा का उपयोग करने के लिए, लेकिन आप एक स्थान है जहाँ आप SharePoint नेट एपीआई DLLs उपयोग कर सकते हैं, तो SPList का उपयोग करने और SPLibrary.Items.Add वास्तव में आसान है में हैं।

+0

कोई विचार नहीं कि यह क्यों ऊपर उठाया गया था: "हमें निश्चित रूप से वेब सेवा परत का उपयोग करने की आवश्यकता है क्योंकि हम इन क्लाइंट को दूरस्थ क्लाइंट अनुप्रयोगों से बनायेंगे।" –

+0

@ माइकलब्लैकबर्न क्योंकि यदि आप इस सवाल के इतिहास को देखते हैं, तो जब तक मैंने अपना उत्तर पोस्ट नहीं किया तब तक उस स्पष्टीकरण को प्रश्न में जोड़ा नहीं गया था। –

+0

आह, मेरी माफ़ी। –

9

एक अन्य विकल्प सादा ol 'HTTP PUT उपयोग करने के लिए है:

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

जहाँ आपके SharePoint दस्तावेज़ लाइब्रेरी को remoteFileURL अंक ...

+0

एरिक ई के साथ सहमत हैं, फिर मेटा डेटा अपडेट करने के लिए आपको एक और संस्करण बनाना होगा (जहां दस्तावेज़ लाइब्रेरी के लिए संस्करण चालू है)। यदि आप ऐसा करते हैं, तो पहला संस्करण संस्करण 2 (या 0.2) होगा। – misteraidan

+1

यह सुनिश्चित नहीं है कि यह सच है, क्योंकि मुझे नहीं लगता कि "PUT" संस्करण में सक्षम होने पर फ़ाइल में चेक करेगा। साथ ही, SPListItem.SystemUpdate() विधि का उपयोग कर एक नया संस्करण बनाये बिना मेटाडेटा को अद्यतन करना संभव होना चाहिए ... –

+2

क्या इसे आईआईएस में डिफ़ॉल्ट अनुमतियों को बदलने की आवश्यकता है? ऐसा करने पर मुझे 403 निषिद्ध अपवाद प्राप्त हो रहा है। – Jeremy

8

चीजों के एक जोड़े पर विचार करने के होते हैं:

  • Copy.CopyIntoItems दस्तावेज़ की जरूरत है कुछ सर्वर पर पहले से ही मौजूद हो सकता है।दस्तावेज़ webservice कॉल के पैरामीटर के रूप में पारित किया गया है, जो दस्तावेज़ को कितना बड़ा हो सकता है सीमित कर देगा। (http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c देखें)
  • 'http डाल' विधि (यानी WebDAV ...) केवल दस्तावेज़ डाल देंगे पुस्तकालय में नहीं, बल्कि सेट क्षेत्र को महत्व देता
  • फ़ील्ड मान अद्यतन करने के लिए आप के बाद Lists.UpdateListItem कॉल कर सकते हैं ' http डाल '
  • दस्तावेज़ पुस्तकालयों निर्देशिका हो सकता है, तो आप उन लोगों के साथ कर सकते हैं' http mkcol '
  • क्या आप भी SPxxx उपयोग करने वाला कस्टम वेब सेवा बना सकते हैं Lists.CheckInFile
  • साथ फाइलों में जाँच करना चाहते हो सकता है। नेट एपीआई, लेकिन उस नए webservice को सर्वर पर स्थापित करना होगा। यह सर्वर पर यात्रा बचा सकता है।
+1

CopyIntoItems के लिए, स्रोत यूआरएल केवल सूचनात्मक है। बिट्स किसी अन्य सर्वर से नहीं आते हैं। –

+0

आज मेरे परीक्षण से, बुलेट # 1 गलत है। आप Copy.CopyIntoItems के साथ सर्वर पर एक पूरी तरह से नया दस्तावेज़ अपलोड कर सकते हैं। – retrodrone

+1

आप सही हैं। मैंने जवाब अपडेट किया है, कृपया अधिकतम आकार की समस्या नोट करें। –

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); 
} 

नोट: फ़ाइल नाम, Path.GetFileName(destinationUrl) को CopyIntoItems के 1 पैरामीटर बदलने, अनलिंक संदेश गायब बनाता है।

संबंधित मुद्दे