2016-03-21 164 views
0

ASP.NETアプリケーションからSharepointドキュメントライブラリからファイルをダウンロードしようとしています。ファイルのリストを取得できましたが、同じコンテキストを使用してダウンロードすると、(401)Unauthorizedエラーが発生しました。問題はthis questionに似ていますが、ユーザーがサインインしなくてもファイルをダウンロードしようとしているので、ユーザー名とパスワードはありません。 、ユーザーログインなしでSharePointドキュメントライブラリからダウンロード

using (var ctx = TokenHelper.GetClientContextWithAccessToken(ConfigurationManager.AppSettings("url"), TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, siteUri.Authority, realm).AccessToken)) 
{     
    var web = ctx.Web; 

    Microsoft.SharePoint.Client.File file = web.GetFileByServerRelativeUrl(fromLocation); 

    ctx.Load(file); 

    ctx.ExecuteQuery(); 

    var fileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(ctx, file.ServerRelativeUrl); 
    using (var ms = new MemoryStream()) 
    { 
     fileInfo.Stream.CopyTo(ms); 
     return ms.ToArray(); 
    } 
} 

答えて

0

をダウンロードしようとアイデンティティと間違っているかを確認する401テキストを検索することができます。私はOpenBinaryDirectを使用して、私はこのかかわらを持って

using (var ctx = TokenHelper.GetClientContextWithAccessToken(ConfigurationManager.AppSettings("url"), TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, siteUri.Authority, realm).AccessToken)) 
{     
    var web = ctx.Web; 

    Microsoft.SharePoint.Client.File file = web.GetFileByServerRelativeUrl(fromLocation); 
    ClientResult(Of Stream) data = file.OpenBinaryStream(); 

    ctx.Load(file); 
    ctx.ExecuteQuery(); 


    HttpContext.Current.Response.ContentType = MimeMapping.GetMimeMapping(file.Name); 
    HttpContext.Current.Response.AppendHeader("content-disposition", "inline;filename=" + file.Name); 
    HttpContext.Current.Response.AppendHeader("content-length", data.Value.Length.ToString()); 
    HttpContext.Current.Response.BinaryWrite(StreamToByteArray(data.Value)); 
    HttpContext.Current.Response.Flush(); 
} 


private byte[] StreamToByteArray(ByVal input As Stream) 
{ 
    byte[] buffer = new byte[16 * 1024]; 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 

一つの問題は、大きなファイルのためである認証の問題に対処することなく、バイト配列に変換し、その上にバイナリ書き込みを呼び出すことができました。 OpenBinaryDirectの代わりにOpenBinaryStreamを使用すると、ダウンロードを開始する前にファイルのロードに時間がかかることを意味します。

0

がyesの場合は、アプリケーションのホスティングプロバイダを使用しているようだあなたは指定されたドキュメントライブラリから読み取るアプリの権限を設定しました: 私のコードは以下のようにありますか?

また、ULSログをチェックして、ファイルからのストリームを取得することにより、文書

関連する問題