Загрузка файлов в библиотеку документов 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
Это исключение. Надеюсь, это поможет.