概要
SharePointのライブラリにファイルを保存するアクションで、特定のファイルだけ保存が失敗する事象に遭遇しました。
結論的には、フォルダ名/ファイル名の長さが直接原因となりBad Requestの形でアクションが失敗します。
厳密には、ファイル保存後のid(識別子)が基準になっていそうで、およそ740バイト前後でエラーとなるようです。
もつろん、SharePointに手動で保存する場合は問題ありません。
症状
出力の内容
The request URL is invalid.
{
"statusCode": 400,
"headers": {
"Connection": "close",
"Date": "Wed, 27 Jul 2022 15:41:24 GMT",
"Content-Length": "324",
"Content-Type": "text/html; charset=us-ascii"
},
"body": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"http://www.w3.org/TR/html4/strict.dtd\">\r\n<HTML><HEAD><TITLE>Bad Request</TITLE>\r\n<META HTTP-EQUIV=\"Content-Type\" Content=\"text/html; charset=us-ascii\"></HEAD>\r\n<BODY><h2>Bad Request - Invalid URL</h2>\r\n<hr><p>HTTP Error 400. The request URL is invalid.</p>\r\n</BODY></HTML>\r\n"
}
SharePointリストに添付保存されたファイルを一つずつ読み出し、DocLibに保存するフローを組んでおり、
ファイルを保存する際に失敗する事象が発生。
問題のファイルはOutlookからエクスポートしたmsgファイル。
ファイル名はメールの件名になる。タイトルが長かったり、記号を含んでいたり、ファイル名が怪しかった。
ファイル名削ると保存に成功したが、idが異様に長いことに気づく。
例:
%252fShared%2bDocuments%252f%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%2582%25e3%2581%258201234567890123456789.msg
何でそんな長いの?
日本語のファイル名はURLエンコードされるため文字数が増えるためです。
なので英語圏ではまず発生しないので事例も見つかりません。
更に、Power Automateでは%自体をエンコードするため2回エンコードがかり、%→%25となり更に増えます。
//元ファイル名
あああ.msg・・・13バイト
//エンコード一回目・・・31バイト
%E3%81%82%E3%81%82%E3%81%82.msg
//エンコード二回目・・・49バイト
%25E3%2581%2582%25E3%2581%2582%25E3%2581%2582.msg
上記のように、全角1文字あたり15バイトの勢いで増えていきます。
740バイト付近が制限だとすると、ファイル名は約50文字くらいでエラーが発生します。
実際にはフォルダパスや拡張子もくっつくのでもう少し短くなります。
何バイトでエラーになるか
ファイルの作成
SharePointのライブラリにファイルを作成するアクションの場合です。
idが742バイトまで登録できることを確認しました。
ただ、ライブラリやフォルダによって730バイトくらいでエラーになる場合もあり、他にも何か影響してそうです。
検証としてPower Automateで1文字ずつ文字数を増やして保存。
ある時点でエラーが発生。
当然ですが、以下のようにフォルダパスが長いと何もファイルを保存できなくなります
ファイルコンテンツの取得
もしやファイルコンテンツを取得する際もエラーにならないかと思い検証。
1024バイトまで実行できることを確認しました。
こちらは意味ありげな数値ですね。
ファイルの作成よりも多くの文字数に対応しているようです。
既に事例がないか調べてみると、遭遇した方がいらっしゃいました。
Excelコネクタでも同様の問題があるようです。
追記
OneDrive/SharePointの公開されている制限で、「パスの長さ」の制限があるようです。
この制限は、URLのsites~のパスが対象になるようです。
あくまでデコード後で400なので今回の長さなら基準内なのですが、Power Automateから操作する場合にエンコード後のパス長さにも制限があり、例えば800バイト程度で制限があるのかもしれません。
SharePoint では、デコードされたファイル パス全体 (ファイル名を含む) の長さは 400 文字以内にする必要があります。 この制限は、デコード後のフォルダー パスとファイル名の組み合わせに適用されます。