2016-03-21 20 views
0

Bir ASP.NET uygulamasından Sharepoint belge kitaplığından bir dosya indirmeye çalışıyorum. Bir dosya listesi alabiliyordum ama indirebilmek için aynı bağlamı kullandığımda, (401) Yetkisiz bir hatayı aldım. Sorun, this question'a benzer, ancak kullanıcı oturum açmadan bir dosya indirmeye çalıştığım için kullanıcı adı ve parola yok. ,Kullanıcı oturum açmadan SharePoint Belge Kitaplığı'ndan indir

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

cevap

0

indirmeyi dener kimliğiyle yanlış olduğunu görmek için 401 metin arayabilirsiniz. Ben OpenBinaryDirect kullanmak ve ben bu olsa birlikte var

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

Bir problem büyük dosya için ise kimlik sorunu ile uğraşmak zorunda kalmadan bir bayt dizisi dönüştürmek ve üzerinde bir ikili dosya yazma çağırmak başardı. OpenBinaryStream yerine OpenBinaryStream kullanılması, indirme başlamadan önce dosyanın yüklenmesi biraz zaman alacağı anlamına gelir.

0

evet eğer App Hosted bir sağlayıcı kullanıyorsanız görünüyor belirtilen belge kitaplığından okumak için uygulama izinlerini ayarlamak vermedi: Kodum takip gibidir?

Ayrıca, ULS günlükleri kontrol ve dosyadan akışı elde ederek belgeyi

İlgili konular