Загрузка файлов в библиотеку документов Sharepoint (WSS 3.0) с помощью HTTP PUT

Привет у меня есть следующий фрагмент кода для загрузки файла в Sharepoint. Он использует 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;
            }
        }

когда я запускаю этот код, я получаю исключение:

" удаленный сервер вернул ошибку: (409) конфликт."

есть ли у кого-нибудь идеи о том, где я ошибаюсь?

спасибо,

Алекс

6 ответов


У меня была эта проблема, когда я ссылался на url-адрес библиотеки документов, а не на сам файл назначения.

например, попробовать http://server имя / имя библиотеки документов / новое имя файла.док!--1-->


понятия не имею. Но почему вы не используете удаленные вызовы процедур (RPC), как я обычно это делаю.

Я нашел этот пример, который может заставить вас начатьhttp://geek.hubkey.com/2007/11/upload-file-to-sharepoint-document.html


попробуй:

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) загрузить документ и 2) установить метаданные документа. 1) и 2) происходят по отдельным HTTP-вызовам. В идеале, я хочу сделать это в один звонок, но я не знаю, как это сделать.

для этого 1) успешно, поэтому документ появляется в библиотеке. Затем, когда я пытаюсь обновить метаданные, я получаю ошибку 409.

Я уверен, что сначала мне нужно вставить шаг между 1) и 2), который сначала загружает список документа (или манифест), который теоретически будет содержать необходимую информацию о версии. Все, что мне нужно сделать, это установить поля метаданных, которые мне нужны, и отправить обратно сервер.

нет, мы не хотим использовать API Sharepoint, потому что для него нет библиотек в Java. ;-)


есть ли причина, по которой вы не можете просто использовать API Sharepoint (например. SPFolder.Файлы.Добавить) загрузить файл? Следующим образом:

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

Алекс, Это случилось и со мной. Вероятно, вы должны создать еще одну библиотеку lit или document и загрузить в нее файлы для тестирования.

вы можете проверить переменную "destUri", чтобы увидеть, указывает ли она точно на ожидаемый список sharepoint.

моя ситуация заключается в том, что я сначала создал библиотеку документов "Requrements", есть опечатка, затем я изменил название на"требования". Обратите внимание, что sharepoint по-прежнему сохраняет URL-адрес этого списка как http://server:port/Requrements

Это исключение. Надеюсь, это поможет.