2017-12-06 10 views
3

Microsoft Graph v1.0 APIとC#を使用して、イメージデータをmultipart/form-dataセクションに書き込んだ後、既存のOneNoteページを更新(パッチ適用)できます。画像の高さと幅は正確ですが、画像はページ上に表示されません - 空の画像プレースホルダー以外。PATCH既存のOneNoteページバイナリイメージの内容を追加して

問題は、PATCHコマンドにOneNoteが期待する正しいイメージ形式は何ですか?ドキュメントは「バイナリイメージデータ」でなければならないと述べています。 File.ReadAllBytesで十分ではありませんか?ここで

形式は、これまでに試みられている。

string file = @"c:\images\file1.jpg"; 

var rawData = System.IO.File.ReadAllText(file); //attempt1 
byte[] bytes = System.IO.File.ReadAllBytes(file); //attempt2 
var byteArray = BitConverter.ToString(bytes); //attempt3 
var byteString = Encoding.ASCII.GetString(bytes); //attempt4 
string base64String = Convert.ToBase64String(bytes, 0, bytes.Length); //attempt5 
string imageDataURL = string.Format("data:image/jpeg;base64,{0}", base64String); //attempt6 

を...

/* Construct message content */ 
StringBuilder sb = new StringBuilder(); 
sb.Append("--MyPartBoundary198374" + "\r\n"); 
sb.Append(@"Content-Disposition: form-data; name=""Commands""" + "\r\n"); 
sb.Append("Content-Type: application/json" + "\r\n" + "\r\n"); 

sb.Append(
@"[{ 
    'target':'body', 
    'action':'append', 
    'position':'before', 
    'content':'<img src=""name:image1"" width=""400"" height=""500""/>' 
}]" 

+ "\r\n" + "\r\n"); 

sb.Append("--MyPartBoundary198374" + "\r\n"); 
sb.Append(@"Content-Disposition: form-data; name=""image1""" + "\r\n"); 
sb.Append("Content-Type: image/jpeg" + "\r\n\r\n"); 
sb.Append([see formats above] + "\r\n"); 
sb.Append("--MyPartBoundary198374--"); 

string content = sb.ToString(); 
string contentType = "multipart/form-data; boundary=MyPartBoundary198374"; 
var result = await OneNoteService.UpdatePageAsync(client, page, contentType, content); 

を...

internal static async Task <HttpResponseMessage> UpdatePageAsync(GraphServiceClient client, OnenotePage page, string contentType, string content) 
{ 
    HttpResponseMessage response = null; 

    try 
    { 
     string requestUri = client.Users[ME].Onenote.Pages[page.Id].Content.Request().RequestUrl; 

     List<OnenotePatchContentCommand> patchCommands = new List<OnenotePatchContentCommand>(); 

     HttpRequestMessage request = new HttpRequestMessage() 
     { 
      Method = new HttpMethod("PATCH"), 
      RequestUri = new Uri(requestUri), 
      Content = new StringContent(content, Encoding.UTF8, "application/json"), 
     }; 

     request.Content.Headers.Remove("Content-Type"); 
     request.Content.Headers.TryAddWithoutValidation("Content-Type", contentType); 

     // Adds the user's access token from the GraphServiceClient to the request. 
     await client.AuthenticationProvider.AuthenticateRequestAsync(request); 

     response = await client.HttpProvider.SendAsync(request); 

     if (!response.IsSuccessStatusCode) 
     { 
      throw new Microsoft.Graph.ServiceException(
       new Error 
       { 
        Code = response.StatusCode.ToString(), 
        Message = await response.Content.ReadAsStringAsync() 
       }); 
     } 
    } 
    catch (Exception ex) 
    { 
     //TODO: Error handling 
     Console.WriteLine(ex.ToString()); 
    } 
    return response; 
} 

この記事に記載されている提案は、問題が解決しませんでした: Inserting image into existing OneNote page via REST api not working

これを1日以上解決しようとしていました。誰かがPATCHコマンドによって期待される適切な画像データ形式を提供することができます。

おかげで、 ローランド

+0

'src'属性で' base64String'を直接使用しようとしましたか(つまり、別の部分として送信していませんか)。 –

+1

src =ソリューションはMarc!どうもありがとうございます!ほんとうにありがとう。他の誰かが読んでいる場合は、base64Stringに接頭辞 "data:image/jpeg; base64"を付ける必要があります。この場合、imageDataURL文字列を使用してください(元の投稿では6)。 – rpo

答えて

1

他の人がこのに遭遇した場合の答えに以前のコメントを移動。

ではなく、複数の部品を送信する、試み5 & 6を組み合わせ、src属性に直接結果を含める:

string base64String = Convert.ToBase64String(bytes, 0, bytes.Length); //attempt5 
string imageDataURL = string.Format("data:image/jpeg;base64,{0}", base64String); //attempt6 

/* Construct message content */ 
StringBuilder sb = new StringBuilder(); 
sb.Append("--MyPartBoundary198374" + "\r\n"); 
sb.Append(@"Content-Disposition: form-data; name=""Commands""" + "\r\n"); 
sb.Append("Content-Type: application/json" + "\r\n" + "\r\n"); 

sb.Append(
@"[{ 
    'target':'body', 
    'action':'append', 
    'position':'before', 
    'content':'<img src=" + imageDataURL + " width=""400"" height=""500""/>' 
}]" 

+ "\r\n" + "\r\n"); 

これは、あなたが挿入しているHTMLで直接画像が含まれます。

関連する問題