使用HttpWebRequest将本地文件上载到SharePoint Online

时间:2014-07-04 15:31:50

标签: rest sharepoint httpwebrequest httpwebresponse

我尝试将文件上传到我有权限的SharePoint在线网站,我尝试使用HttpWebRequest获取XDocument以允许我上传文件,但是当我调用HttpWebResponse时,我得到了错误"底层连接已关闭:接收时发生意外错误。"

我无法使用SharePoint客户端对象模型,因为此应用程序将用于没有安装SharePoint的PC。

1 个答案:

答案 0 :(得分:1)

您需要创建一个摘要:

HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.BaseAddress = new System.Uri(url);
string cmd = "_api/contextinfo";
client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
client.DefaultRequestHeaders.Add("ContentType", "application/json");
client.DefaultRequestHeaders.Add("ContentLength", "0");
StringContent httpContent = new StringContent("");
var response = client.PostAsync(cmd, httpContent).Result;
if (response.IsSuccessStatusCode)
{
    string content = response.Content.ReadAsStringAsync().Result;
    JsonObject val = JsonValue.Parse(content).GetObject();
    JsonObject d = val.GetNamedObject("d");
    JsonObject wi = d.GetNamedObject("GetContextWebInformation");
    retVal = wi.GetNamedString("FormDigestValue");
}

然后,您可以使用以下示例上传文件并从http响应中检索其元数据:

HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.BaseAddress = new System.Uri(url);
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Add("Accept", "application/json;odata=verbose");
client.DefaultRequestHeaders.Add("X-RequestDigest", digest);
client.DefaultRequestHeaders.Add("X-HTTP-Method", "POST");
client.DefaultRequestHeaders.Add("binaryStringRequestBody", "true");
IRandomAccessStream fileStream = await path.OpenAsync(FileAccessMode.Read);
var reader = new DataReader(fileStream.GetInputStreamAt(0));
await reader.LoadAsync((uint)fileStream.Size);
Byte[] content = new byte[fileStream.Size];
reader.ReadBytes(content);
ByteArrayContent file = new ByteArrayContent(content);
HttpResponseMessage response = await client.PostAsync(String.Concat("_api/web/lists/getByTitle('Project Photos')/RootFolder/Files/add(url='", filename, ".jpg',overwrite='true')?$expand=ListItemAllFields"), file);
response.EnsureSuccessStatusCode();
if (response.IsSuccessStatusCode)
{
    var info = response.Content.ReadAsStringAsync();
    JsonObject d = JsonValue.Parse(info.Result).GetObject();
    string id = d["d"].GetObject()["ListItemAllFields"].GetObject().GetNamedValue("ID").Stringify();
 }