2009-02-27 32 views
9

こんにちは私はSharepointにファイルをアップロードする次のコードを持っています。これは、HTTPのPUTを使用しています。HTTP PUTを使用してSharepoint(WSS 3.0)ドキュメントライブラリにファイルをアップロード

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

私はこのコードを実行すると、私は例外を取得:

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

誰も私が間違っているつもりどこになどの任意のアイデアを持っていますか?

おかげで、

アレックス

+0

私はちょうど同じ問題に直面しました - URLが有効であることを確認してください! – Rashack

+0

C#noob asks:CopyStreamはどこから来たのですか? –

+2

CopyRiverのオフショー – Amicable

答えて

8

私は、ドキュメントライブラリのURLを参照していて、宛先ファイル自体を参照していないときにこの問題が発生しました。

すなわち試みるhttp://server名/ドキュメントライブラリ名/新しいファイル名.doc

+0

私は同じ問題があり、あなたのソリューションは完璧に動作します。シンプルで効率的。 – Antoine

+0

それはトリックでした。乾杯! – leeand00

0

を始めるかもしれません。この例では、あなただけSharepointのAPIを使用することはできませんpaticular理由は見つかった(例えば。SPFolder.Files.Add)ファイルをアップロードしますか?次のように:

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

この方法ではサーバー上でコードを実行する必要はありませんか?私は質問がhttpを介して投稿することだと思う。 – msulis

0

アレックス、 をこれも私に起こりました。別の照明やドキュメントライブラリを作成し、それにファイルをアップロードしてテストする必要があります。

変数 "destUri"をチェックして、予想される共有ポイントリストを正確に指しているかどうかを確認することができます。

私の状況は、まずドキュメントライブラリ "Requrements"を作成していますが、タイプミスがあり、タイトルを "Requirements"に変更しました。 SharepointはこのリストのURLをまだ保持しています。http://server:port/Requrements

これは例外です。うまくいけば助けてくれます。

1

試してみてください。私はまだ私の問題を解決していない

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

、私がここにいる理由ですが、私は知っていますなぜこのエラーが発生しているのですか?

このエラーは、非表示の必須フィールドを設定していないために発生します。私の場合、私は列がなく、確かに必要なものはありませんでした。ただし、競合するバージョン管理フィールドがあります。

私の意図は、1)文書をアップロードし、2)文書のメタデータを設定することです。 1)と2)は別々のHTTP呼び出しで発生します。理想的には、私はこれを1回の呼び出しで行いたいが、これを行う方法はわからない。

これを達成するには、1)が成功するため、ドキュメントがライブラリに表示されます。次に、メタデータを更新しようとすると、それは409エラーが発生したときです。

私はまず、理論上は必要なバージョン情報が含まれているドキュメントのリスト(またはマニフェスト)を最初にダウンロードする1)と2)の間にステップを挿入する必要があります。私が必要とするのは、必要なメタデータフィールドを設定してサーバーに返すだけです。

いいえ、Sharepoint APIはJava用のライブラリがないため、使用しません。 ;-)

関連する問題