tags:

views:

14771

answers:

8

What is the best way to upload a file to a Document Library on a SharePoint server through the built-in web services that version WSS 3.0 exposes?

Following the two initial answers...

  • We definitely need to use the Web Service layer as we will be making these calls from remote client applications.

  • The WebDAV method would work for us, but we would prefer to be consistent with the web service integration method.

There is additionally a web service to upload files, painful but works all the time.

Are you referring to the “Copy” service? We have been successful with this service’s CopyIntoItems method. Would this be the recommended way to upload a file to Document Libraries using only the WSS web service API?

I have posted our code as a suggested answer.

+1  A: 

From a colleage at work:

Lazy way: your Windows WebDAV filesystem interface. It is bad as a programmatic solution because it relies on the WindowsClient service running on your OS, and also only works on websites running on port 80. Map a drive to the document library and get with the file copying.

There is additionally a web service to upload files, painful but works all the time.

I believe you are able to upload files via the FrontPage API but I don’t know of anyone who actually uses it.

Ben Scheirman
Word, Excel (and other Office apps) use FrontPage API as do many others. In the 2010 version CMIS will be supported.
Lou Franco
+1  A: 

Not sure on exactly which web service to use, but if you are in a position where you can use the SharePoint .NET API Dlls, then using the SPList and SPLibrary.Items.Add is really easy.

Daniel O
+7  A: 
Andy McCluggage
Have you found any issues with errors when the file already exists? I started using this technique but found I constantly received an error "Cannot create an item at the requested destination. Verify that the folder exists and that you have permission to edit in it". Anyone else had this problem?
misteraidan
UPDATE -- if destinationUrl is the same as the url inside destinationUrls[], the error above is thrown if the file/item already exists .... (rant: why can't we edit comments?!)
misteraidan
No, I never had any such problems. It's your classic "bad destination" error, but if you are sure the destination is correct and that you have permission, I can't think what else could be causing this.
Andy McCluggage
Can you expand this to show how to call this? In particular what the destinationUrl parameter should be?
Robert MacLean
+4  A: 

I've had good luck using the DocLibHelper wrapper class described here: http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html

Eugene Katz
+4  A: 

Another option is to use plain ol' HTTP PUT:

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

Where remoteFileURL points to your SharePoint document library...

Jim Harte
Agree with Erik E though, to then update the meta data you will need to create another version (where versioning for the doc library is turned on). If you do this, the first version will be Version 2 (or 0.2).
misteraidan
Not sure this is true, since I don't think the "PUT" will check in the file if versioning is enabled. Also, it should be possible to update metadata without creating a new version by using the SPListItem.SystemUpdate() method...
Jim Harte
+4  A: 

There are a couple of things to consider:

  • Copy.CopyIntoItems needs the document to be already present at some server
  • the 'http put' method (ie webdav...) will only put the document in the library, but not set field values
  • to update field values you can call Lists.UpdateListItem after the 'http put'
  • document libraries can have directories, you can make them with 'http mkcol'
  • you may want to check in files with Lists.CheckInFile
  • you can also create a custom webservice that uses the SPxxx .Net API, but that new webservice will have to be installed on the server. It could save trips to the server.
Erik E
For CopyIntoItems, the source url is only informational. The bits don't come from some other server.
Tony Lee
A: 

hi

What is url or this exposed webservice?

Or what is namespace for harePoint2007CopyService?

faisal
You need to add a Service Reference to the Sharepoint services in Visual Studio. From memory, I think the end point is usually in the form "http://hostname/_vti_bin/servicename.asmx"
Andy McCluggage
A: 
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);
}

I added a Web Reference instead. Is this just as fast/reliable versus using CopySoapClient or what are the differences?

Luke Hutton
Side note: Changing the 1st parameter of CopyIntoItems to the file name, Path.GetFileName(destinationUrl), makes the unlink message disappear
Luke Hutton