3

私は本質的に一連の区切られたテキストファイルを繰り返し、そのファイルからSharePointサイトに画像をアップロードするスクリプトを用意しています。それは素晴らしい、1つのマイナーな問題を期待して、私は大きさの> 4メガバイトの画像があり、これらは私が(400) Bad Requestスクリプトをアップロードしようとするとエラーが発生します。以下大きな画像ファイルをSharePointにアップロードすると問題が発生する

コード:今

class spImageUpload() 
    { 
     private static System.Collections.Generic.List<string> keywords; 
     private static NetworkCredential credentials = new NetworkCredential(username, password, domain); 
     private static ClientContext clientContext = new ClientContext(site name); 
     private static Web site = clientContext.Web; 
     private static List list = site.Lists.GetByTitle(listName); 
     private static FileCreationInformation newFile = new FileCreationInformation(); 

     private static Image image = new Image(); 
     private static FileIO fo = new FileIO(); 

     public SharePointAccess() 
     { 
      sharepointLogin(); 
      uploadImage(); 
     } 

     private static void updateFields() 
     { 
      //Loads the site list 
      clientContext.Load(list); 
      //Creates a ListItemCollection object from list 
      ListItemCollection listItems = list.GetItems(CamlQuery.CreateAllItemsQuery()); 
      //Loads the listItems 
      clientContext.Load(listItems); 
      //Executes the previous queries on the server 
      clientContext.ExecuteQuery(); 

      //For each listItem... 
      foreach (var listItem in listItems) 
      { 
       //Writes out the item ID and Title 
       //Console.WriteLine("Id: {0} Title: {1}", listItem.Id, listItem["Title"]); 
       //Loads the files from the listItem 
       clientContext.Load(listItem.File); 
       //Executes the previous query 
       clientContext.ExecuteQuery(); 
       //Writes out the listItem File Name 
       //Console.WriteLine("listItem File Name: {0}", listItem.File.Name); 

       //Looks for the most recently uploaded file, if found... 
       if (listItem.File.Name.Contains(fileName)) 
       { 
        title = fileName; 
        //Changes the Title field value 
        listItem["Title"] = title; 
        //Changes the Keywords field value using the keywords list 
        foreach (var keyword in keywords) 
        { 
         listItem["Keywords"] += keyword; 
         //Writes out the item ID, Title, and Keywords 
         //Console.WriteLine("Id: {0} Title: {1} Keywords: {2}", listItem.Id, listItem["Title"], listItem["Keywords"]); 
        } 
       } 
       //Remember changes... 
       listItem.Update(); 
      } 
      //Executes the previous query and ensures changes are committed to the server 
      clientContext.ExecuteQuery(); 
     } 

     private static void uploadImage() 
     { 
      try 
      { 
       fo.loadFile(); 

       foreach (var img in fo.lImageSet) 
       { 
        Console.WriteLine("Image Name: {0}", img.getName()); 
       } 

       foreach (var img in fo.lImageSet) 
       { 
        DateTime start; 
        DateTime end; 

        start = DateTime.Now; 
        //Sets file path equal to the path value stored in the current image of lImageSet 
        filePath = img.getPath(); 
        //Writes out to the console indicating what's been stored in filePath 
        Console.WriteLine("Image Path: {0}", filePath); 
        //Reads in the contents of the file 
        newFile.Content = System.IO.File.ReadAllBytes(filePath); 
        //Sets the file name equal to the name value stored in the current image of lImageSet 
        fileName = img.getName() + ".jpeg"; 
        //Sets the URL path for the file 
        newFile.Url = fileName; 
        //Creates a List object of type String 
        keywords = new System.Collections.Generic.List<string>(); 
        //For each keyword in the current image stored in lImageSet... 
        foreach (var keyword in img.lTags) 
        { 
         //...add that keyword to the newly created list 
         keywords.Add(keyword); 
        } 
        //Uploads the file to the picture library 
        Microsoft.SharePoint.Client.File uploadFile = list.RootFolder.Files.Add(newFile); 
        //Loads uploadFile method 
        clientContext.Load(uploadFile); 
        //Executes previous query 
        clientContext.ExecuteQuery(); 

        //Calls the updateFields method to update the associated fields of the most recently uploaded image 
        updateFields(); 

        end = DateTime.Now; 
        TimeSpan span = end.Subtract(start); 
        //Writes out to the console to indicate the file has finished being uploaded 
        Console.WriteLine("Uploaded: {0}", fileName + " Done!"); 
        Console.WriteLine("Time Elapsed: {0}", span.Seconds + "seconds"); 

       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

     private static void sharepointLogin() 
     { 
      try 
      { 
       //Loads credentials needed for authentication 
       clientContext.Credentials = credentials; 
       //Loads the site 
       clientContext.Load(site); 
       //Loads the site list 
       clientContext.Load(list); 
       //Executes the previous queries on the server 
       clientContext.ExecuteQuery(); 
       //Writes out the title of the SharePoint site to the console 
       Console.WriteLine("Title: {0}", site.Title); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 
    } 

、私はリモートでクライアントオブジェクトモデルを使用して、すべてを行う必要があります。 SharePoint.Administrationを使用して最大アップロードサイズを変更することはできません。だから誰も知っている、私は4MB以上のファイルをアップロードすることができないこの問題を過ぎて得ることができるクライアントオブジェクトモデルを使用して?助けをよろしくお願いします。

+0

この制限はセキュリティ上の措置ですので、これを回避することは、可能な場合でも可能な限り「ハッキングする」ようなものになると思われます。サーバー側の制限を変更しないでプロダクションコードで使用できるものがあれば... – Yahia

+0

唯一の実現可能なオプションはSharePoint管理者に連絡してサーバー側の設定を変更することだと思いますか? –

+0

私は間違っているかもしれませんが、これはどのように表示されるのですか... – Yahia

答えて

3

これは、クライアントオブジェクトモデルのWCF制限のためです。あなたは、管理者権限でのSharePoint管理シェルからサーバー上でこれを実行する必要があります。

SPWebService contentService = SPWebService.ContentService; 
contentService.ClientRequestServiceSettings.MaxReceivedMessageSize = int.MaxValue; // 2GB 
contentService.Update(); 

More info here

2

はSaveBinaryDirectメソッドを使用してみてください。 SaveBinaryDirectメソッドは、ファイルのアップロードとダウンロードにWebベースの分散オーサリングとバージョン管理(WebDAV)を使用します。独自のカスタムWCFサービスを構築することなく、WebDAV がファイルをアップロードしてダウンロードする最も効率的な方法です。

using (FileStream lp_fs = new FileStream(is_FileToImport, FileMode.OpenOrCreate)) 
{ 
    Microsoft.SharePoint.Client.File.SaveBinaryDirect(lp_context, lp_uri.LocalPath, lp_fs, true); 
} 
Microsoft.SharePoint.Client.File lp_newFile = lp_web.GetFileByServerRelativeUrl(lp_uri.LocalPath); 
lp_context.Load(lp_newFile); 
lp_context.ExecuteQuery(); 

//check out to make sure not to create multiple versions 
lp_newFile.CheckOut(); 

ListItem lp_item = lp_newFile.ListItemAllFields; 
listItem["Created"] = info.SourceFile.CreationTime; 
listItem["Modified"] = info.SourceFile.LastWriteTime; 
listItem.Update(); 

// use OverwriteCheckIn type to make sure not to create multiple versions 
lp_newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn); 
関連する問題