ファイル作成時に名前長すぎてエラー の回避方法(10/24 追加調査更新)

はじめに

先日検証していて、以下参考URLにあるSPOでの「パス(フォルダ名+ファイル名)が長すぎるとファイル作成でエラーが発生」事象が解消した(と思われる)ので共有です。
色々検証しながら記事を書いていたら、最後の方法でサクッと解消できたのでそれ以外は備忘録的な内容となります。
※ざっとした確認で問題なしでしたが、要因など不明確なので、間違いあったりしたらご容赦ください。

TIPS以下のLT登壇の際に、チャンクの許可をオフにした場合のSPOファイル作成時の対応容量などについて追加調査しました!本記事の最後に概要と記事へのリンクを追加しております。

NOTESPOやOneDrive側の制限でエンコード後の文字数400文字の制限はありますので、それ以下であればという前提です。OneDrive と SharePoint の制限事項と制約事項 – Microsoft サポート

ぴーたくん

海外だとあまり影響ないのかもしれないけど、日本人は困っている人多そうだよね

ファイル名が一定以上に長いとエラーになる事象

まずこの事象ですが、SharePointのファイルの作成アクションで、ファイルパス(フォルダ名+ファイル名まで)のエンコード後のバイト数が740ほどとなるとエラーが発生するというものです。
ファイルの識別子(ID)にこのパスをエンコードしたものが使われるのですが、2バイト文字の場合、エンコード×エンコードという感じで1文字が15バイトくらいになってしまい、軽く740バイトに達します。大体日本語のみで5、60文字で到達する感じかと。詳細は参考記事ご参考ください。

エラー検証

実際に以下の状況で試してみるとエラーが発生します。SPOライブラリからファイルを取得し作成しています。

・指定ライブラリに長い名前のフォルダを作成しておく
・そのフォルダに長いファイル名でファイルを作成する

→フォルダ名とファイル名が一定以上長いとエラー、それ以下なら正常に作成される。

コピーする元のファイルと長い名前のフォルダ

元のファイルを取得して長いフォルダ名に新しい名前で作成するフロー

成功時(上記の制限以下)

上記のまま実行した場合は正常に完了します。
この際に作成されるファイル識別子(id)は以下で見れます。
この文字数を数えると「616」ですね。上記の740には収まっています。

LEN関数でカウント

エラー時(上記制限以上)

次にもう少しファイル名を長くしてみます。さきほど616だったので10文字くらい増やしてみます。大体750くらいになるのかなと。※エラー時にIDが取れないのでざっとです。

以下のようにエラーとなりました。参考の記事にもある同じエラーです。

作成アクションが失敗

ボディの内容<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN””http://www.w3.org/TR/html4/strict.dtd”>
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV=”Content-Type” Content=”text/html; charset=us-ascii”></HEAD>
<BODY><h2>Bad Request – Invalid URL</h2>
<hr><p>HTTP Error 400. The request URL is invalid.</p>
</BODY></HTML>

このエラーメッセージではidが長すぎるからエラーだとよは読み取れませんが、これ以上の文字数でも同様にエラーになりますし、これ以下なら成功するので、参考記事の情報どおり、パス→ファイルの識別子(ID)に起因するものと思われます。

NOTE上記のサンプルではドキュメントライブラリの画像ファイルを使用していますが、
SPOの添付ファイルの場合やDataverseのファイル取得の場合も同様に事象が発生しました。
また複数環境で確認しましたがいずれも発生していました。※英語、日本語の環境差は未確認

解消方法

実は検証中に2通りみつけたんですが、最後に3つ目を見つけてそれだけでOKそうです。

  1. 1つめはトリガーのパラメータで渡したファイルなら発生しない
  2. 2つめはファイル取得したものを一旦作成アクションに入れてから指定する
  3. 3つめ(これだけでOKそう)はファイル作成アクションのチャンクの許可をオフにする

元々アプリからパラメータでファイル渡した場合に発生しなかったので、なぜかな??と思い色々調査してみたのがきっかけです。

①パラメータで渡した場合は起きない

以下のようにフローのトリガーでパラメータで同じファイルを渡した場合、同じパスの長さでもエラーが起きません!先ほどエラーとなったIDの文字数は766でした。

パラメータで同じファイルを渡してファイルコンテンツに指定

エラー発生せずファイルが作成される。中身も問題なし

作成できたIDの長さは766

さらにもっと名前を長くしてもエラーは発生しません。
以下の場合、IDの文字数は2,416でした。3000でも大丈夫でした。

②作成アクションに入れると起きない

パラメータで渡した場合は起きないけども、実際にはSPOのリストの添付ファイルやライブラリ、Dataverseから取ってそれをそのまま作成するケースの方が多いので、他の方法はないのかと色々やっていたら、
作成アクションに入れたものをそのまま指定したらなぜか同じくエラーがでなくなりました!

一旦取得したファイルコンテンツを作成アクションにいれて、それを指定する


ファイルもちゃんとしています。

という感じで、なぜか作成アクションに入れて使ったら解消した。となります。
※変数アクションだとバイナリ保持されなかった。作成アクションだとOK

作成時の挙動も異なる(既存があると上書き)

上記でフォルダ名+ファイル名が一定以上でもエラーが発生しないように調整できました。
また、あわせて、作成時の挙動も異なりました。
元の場合は既存ファイルがあるとエラーとなるが、上記対応の場合は上書きとなる。

ファイルの作成アクションで従来(ファイル取得したものをそのままファイル作成で使用)で作成した場合は同じファイルがあると作成時エラーが出ます。
このため、一意の名前となるように日時を付けたり、先にファイル存在チェックするなどで回避が必要でした。

同名ファイルが既にある場合に作成エラーとなり作成できない。

ところが上記の文字数でエラーにならない実装(パラメータ渡しと作成アクション)の場合は、上記エラーは出ずに、そのまま上書きしてくれます。この段階でさらに調査したところ、以下3つ目の方法にたどり着きました。

チャンクの許可をオフにする でどちらも解消した!

ファイル作成時にエラーとなる挙動について確認したら、以下の記事で
コンテンツ転送のチャンクの許可をオフにするとエラーとならず上書きになってくれると確認しました!

試しに変更してみると、たしかに同名ファイルがあってもエラーとならず上書きしてくれました!
さらに、今回の検証目的だった長いパスのファイルの場合でも同様にエラーがでませんでした!

ぱわ代

なぜかこの設定で解消するのね!理由がよくわからないけれど解消するならいいわ!(とりあえずは)きっと裏側の処理のどこかが違うんでしょうね。

ファイルの作成アクションの設定からコンテンツ転送>チャンクの許可をオフにする(既定でオン)
チャンクの許可をオフにする→長いパスでも正常終了

同名ファイルがあった場合はファイルが上書きされる

OneDriveではそもそも起きない

SPOの場合は上記のように最初のままだとエラーになっていましたが、OneDriveの方はそもそもエラーは起きませんでした。
ファイル名が同様に長いものでも正常に作成でき、同じ名前のファイルがあっても上書きする挙動でした。
ファイルのIDも形式が異なり長くなったりしてないのでその点も関連するのかもしれません。
ちなみにこっちのアクションはチャンクの許可はオンのままですね。うーん。。

ファイルの取得時も対応が必要

上記のようにSPOのファイル作成で長い名前のファイルが保存出来た場合でも、ファイルコンテンツの取得アクションでもファイル識別子(ID)が使用されるので、ここでエラーとなります(参考記事によると1024くらいでエラーになるとあり)
この点は「パスによるファイルコンテンツの取得」にすることで長いパスのファイルでもエラーとならず取得が可能です。
こちらも併せての考慮が必要ですね。

パスによるファイルコンテンツの取得とファイルコンテンツの取得

パスによるは成功だが、ID指定のコンテンツ取得の方は長いと同様のエラーとなる

ぴーたくん

取得時のほうも考慮が必要だねー。とりあえずID指定するアクションはさけて、パスによる取得に切り替えたら安心そうだね。

おわりに

ということで、最初に作成アクションに入れたら解消してさらに上書きもできた!を確認したときはうれしかったのですが、チャンクの許可をオフにするのほうが設定のみで対応できるので、結果3つ目が解消方法となりますね。

その他は備忘録として、各パターンで発生、発生しないのがわかったという点で記載を残してます。
パラメータ渡しの場合や作成アクション挟んだ場合は(なぜかわかりませんが)チャンクの許可オフと同様の裏の動きになってくれるんですかね。わかりませんがそんな印象です。

その他、記載は割愛しましたが、そのままファイル指定と作成アクションを経ての場合で、ファイルの作成アクションの入力値情報は全く同じでした。※コンテンツタイプとバイナリを渡していてどちらも同じだった
パラメータ渡しの場合はコンテンツのバイナリのみを渡していて上とは入力値は異なりました。(これと同じようにファイル指定でコンテンツのみを指定にした場合は中身が壊れていた)
UI上で操作、確認できる以外の部分で裏情報が何やらあるのかなーという感じでした。

また、チャンクの許可をオフにするとなぜ解消するのか?という点も自身わかっていません💦
とりあえず解消するならいいやのスタンスですのでご容赦ください。

本記事が今後同様の事象に悩まされている方のお助けになれば幸いです。それでは。

パワ谷さん

要因がよくわかってないけど解消したしまあよしということで

追加検証:チャンクの許可をオフでの対応容量

冒頭にも追記しましたが、先日 2023/10/21にMVPたなさん主催の気ままに勉強会にLT登壇した際に本記事のことをLTしました。
その際にチャンクの許可をオフにした場合のSPOファイル作成の実際の挙動について確認したので追記します。

概要としては、
・SPOファイル作成アクションは90MBまではチャンクの許可をオフにしても対応可能。それ以上となるとエラーになります。
・作成アクションとパラメータ渡しの挙動はチャンクの許可をオフと同じだった。
 →作成アクションは1アクション増えるので、チャンクの許可をオフにするで良いと思います。
・チャンクの許可をオンのままの場合は90MBを突破できました。100MBは作成できました。
ただ、Automateの制限のページにはチャンクの許可をオンの場合~1GBまで対応可能とありましたが、SPOのファイルの取得アクションでファイルが100MB以上だとそっちがエラーとなりました。
そのため100MB以上は今回未検証です。

個人の感想としては90MBまでオフでも動作するのであれば、おおむねこれ(チャンクの許可をオフ)で良いのかと思います。これ以上の容量のファイルを扱う場合、別の箇所でも制限がある可能性がありますので全体的に影響調査をした方がよいでしょう。まあ、通常は90MB以内で使うと考える方が無難ですね。

もし大容量ファイルを扱う場合はSPOのREST APIを使うと対応できる可能性があると思います。
作成は調査していないですが、ファイルコピー、移動などについては以前大容量ファイルの場合にREST APIで対応したことがあります。

以下、登壇資料からこの部分を抜粋したものです。ご参考ください。

参考リンク

登壇資料

気ままに勉強会にLT登壇させていただいた際の資料です。

チャンクの許可をオフの対応容量

上記登壇時に追加検証した対応する容量などについてを抜き出し記事にしました。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

ヨウセイ

ヨウセイ

一般職からSharePoint、C#、.NET系技術者へ、そこからPower App、Power Automate技術者へと転身。 ワンランク上のおっさんはPower Appsでシステム開発が出来る〜! qiitaや自社HPでも技術ブログを書いていました。

関連記事

コメント

この記事へのコメントはありません。

CONTENTS