2009-02-27 37 views
9

Xin chào Tôi có đoạn mã sau đây để tải tệp lên Sharepoint. Nó sử dụng HTTP PUT:Tải tệp lên thư viện tài liệu Sharepoint (WSS 3.0) bằng cách sử dụng HTTP PUT

public static string UploadFile(string destUrl, string sourcePath) 
     { 
      try 
      { 
       Uri destUri = new Uri(destUrl); 
       FileStream inStream = File.OpenRead(sourcePath); 
       WebRequest req = WebRequest.Create(destUri); 
       req.Method = "PUT"; 
       req.Headers.Add("Overwrite", "F"); 
       req.Timeout = System.Threading.Timeout.Infinite; 
       req.Credentials = CredentialCache.DefaultCredentials; 
       Stream outStream = req.GetRequestStream(); 
       string status = CopyStream(inStream, outStream); 
       if (status == "success") 
       { 
        outStream.Close(); 
        WebResponse ores = req.GetResponse(); 
        return "success"; 
       } 
       else 
       { 
        return status; 
       } 
      } 
      catch (WebException we) 
      { 
      return we.Message; 
      } 
      catch (System.Exception ee) 
      { 
      return ee.Message; 
      } 
     } 

Khi tôi chạy mã này tôi nhận được ngoại lệ:

"The remote server returned an error: (409) Conflict."

Có ai có bất kỳ ý tưởng như những nơi tôi đang đi sai?

Cảm ơn,

Alex

+0

Tôi vừa gặp phải vấn đề rất giống nhau - hãy kiểm tra xem URL có hợp lệ không! – Rashack

+0

C# noob hỏi: CopyStream đến từ đâu? –

+2

Đó là một nhánh của CopyRiver – Amicable

Trả lời

8

Tôi đã gặp sự cố này khi tôi tham chiếu url của thư viện tài liệu chứ không phải là tệp đích.

tức là thử http://server tên thư viện/tài liệu tên/mới tập name.doc

+0

Tôi gặp vấn đề tương tự và giải pháp của bạn hoạt động hoàn hảo. Đơn giản và hiệu quả. – Antoine

+0

Yup đã làm điều đó. Chúc mừng! – leeand00

0

Có một lý do paticular bạn không thể chỉ sử dụng API Sharepoint (ví dụ. SPFolder.Files.Add) để tải lên các tập tin? Như sau:

http://msdn.microsoft.com/en-us/library/ms454491.aspx

public void UploadFile(string srcUrl, string destUrl) 
{ 
    if (! File.Exists(srcUrl)) 
    { 
     throw new ArgumentException(String.Format("{0} does not exist", 
      srcUrl), "srcUrl"); 
    } 

    SPWeb site = new SPSite(destUrl).OpenWeb(); 

    FileStream fStream = File.OpenRead(srcUrl); 
    byte[] contents = new byte[fStream.Length]; 
    fStream.Read(contents, 0, (int)fStream.Length); 
    fStream.Close(); 

    EnsureParentFolder(site, destUrl); 
    site.Files.Add(destUrl, contents); 
} 
+5

Cách tiếp cận này có yêu cầu chạy mã trên máy chủ không? Tôi nghĩ câu hỏi là về việc đăng bài trên http. – msulis

0

Alex, này xảy ra với tôi quá. Bạn có thể xảy ra nên tạo một thư viện tài liệu sáng hoặc tài liệu khác và tải tệp lên đó để kiểm tra.

Bạn có thể muốn kiểm tra biến "destUri" để xem liệu nó có trỏ đến chính xác danh sách người chia sẻ dự kiến ​​hay không.

Tình huống của tôi trước hết là tạo thư viện tài liệu "Requrements", có lỗi chính tả, sau đó tôi đã đổi tiêu đề thành "Yêu cầu". Bạn sẽ nhận thấy rằng sharepoint vẫn giữ URL vào danh sách này là http://server:port/Requrements

Đây là một ngoại lệ. Hy vọng nó giúp ích.

1

Hãy thử:

void StorePlainFile(string target_url, string filename, byte[] file_bytes) 
{ 
     string url = target_url + "/" + filename; 
     System.Net.WebClient client = new System.Net.WebClient(); 
     client.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     client.Headers.Add("Overwrite", "F"); 
     byte[] response = client.UploadData(url, "PUT", file_bytes); 
} 
1

tôi đã không giải quyết vấn đề của tôi chưa, đó là lý do tại sao tôi ở đây, nhưng tôi biết tại sao bạn nhận được lỗi này.

Kết quả lỗi vì bạn không đặt trường ẩn, nhưng được yêu cầu. Trong trường hợp của tôi, tôi không có cột, và chắc chắn không có cột nào được yêu cầu. Tuy nhiên, có một trường phiên bản xung đột.

Mục đích của tôi là 1) tải lên tài liệu và 2) đặt siêu dữ liệu của tài liệu. 1) và 2) xảy ra qua các cuộc gọi HTTP riêng biệt. Lý tưởng nhất, tôi muốn làm điều này trong một cuộc gọi duy nhất, nhưng tôi không biết làm thế nào để làm điều này.

Để thực hiện việc này, 1) thành công, do đó tài liệu xuất hiện trong thư viện. Sau đó, khi tôi cố gắng cập nhật siêu dữ liệu, đó là khi tôi gặp lỗi 409.

Tôi khá chắc chắn rằng trước tiên tôi cần chèn một bước ở giữa 1) và 2) lần đầu tiên tải xuống danh sách tài liệu (hoặc tệp kê khai) trong lý thuyết chứa thông tin phiên bản cần thiết. Tất cả những gì tôi cần làm là đặt các trường siêu dữ liệu tôi cần và gửi lại cho máy chủ.

Không, chúng tôi không muốn sử dụng API Sharepoint vì không có thư viện nào trong Java. ;-)

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