Skip to content
You have no unread notifications
funige  /   neo  /   Pull requests #100  /  
Open in github.dev Open in a new github.dev tab Open in codespace
Code

サーバのPOSTの上限を超えるPOST時に動画、画像ともに投稿に失敗する問題 #100

Closed
wants to merge 1 commit into from

Conversation

satopian

Collaborator

@satopian satopian commented Feb 9, 2024

運営しているサイトで、投稿できるPOSTのデータサイズの上限を20MBに設定していましたが、20MBを超えるpchアニメデータが生成され、画像・動画・拡張ヘッダすべてのPOSTが失敗する問題が発生しました。
その時のサーバの設定は

upload_max_filesize = 20M
post_max_size = 20M

でした。
ここで、例えば

upload_max_filesize = 5M
post_max_size = 20M

とすれば、pchファイルが15MBでPOSTの合計が20MB以下の時はpchアニメデータだけ投稿されず、画像の投稿は成功します。
しかし、
post_max_size = 20M
の場合は、
upload_max_filesize
の設定にかかわらず、POSTの合計サイズが20MBを超えた時点でPOSTはサーバに拒絶され失敗してしまいます。

そのため、neo.jsに処理を追加し、ペイント画面にもneoに数値を渡すためのオプションを設定しました。

<param name="neo_max_pch" value="<?=h($max_pch)?>">

変数には、post_max_sizeで設定されている値を

$max_pch = min((int)ini_get('post_max_size'),(int)ini_get('upload_max_filesize'));

このように、ini_get()で取得してMB単位でセットしています。
さくらのレンタルサーバライトのデフォルト値であれば、 8MBになるため

<param name="neo_max_pch" value="8"> 

のように値として8がセットされ、neoに渡されます。

そして、POSTの合計サイズを計算して、サーバ側のPOST可能な上限を超えている時はpchアニメデータファイルを添付せず、画像の投稿を成功させます。
ただ、この時に、レイヤー情報が失われる事をユーザーに知らせる必要があるため

		if(pchFileNotAppended){
			if (window.confirm(Neo.translate("画像のみが送信されます。\nレイヤー情報は保持されません。"))) {
				postData(url, formData);
			} else {
				console.log("中止しました。");
			}
		}else{
			postData(url, formData);
		}

window.confirmで、レイヤー情報なしで投稿する事を説明して、OKが押された時にのみ投稿処理を行います。
これにより、レイヤー情報が失われるとは思わずに、途中保存の上のレイヤーを黒塗りしたり白塗りしたりした画像だけが投稿されるのを防止します。

運営しているサイトではこの処理が必要だったのですが、PaintBBS オリジナルの処理という訳でもないので、マージするかどうかの判断は作者であるFunigeさんの判断になります。(当たり前ですが…)
面倒な話ばかりですみませんが、よろしくご検討ください。

@funige

Owner

funige commented Feb 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

いつもありがとうございます。
すっかり忘れているので、また少し思い出すためのお時間ください。
サイト寄りの処理はPaintBBS本体の実装とできるだけ分離したいところなのですが
うーん……ちょっとお時間ください。すみません……。

@satopian

Collaborator Author

satopian commented Feb 11, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

自動で取得したサーバの上限なりユーザーが手作業で設定した最大の送信許可サイズなりなんなりをNEOに渡す処理がないと、巨大なPOSTになってすべて失敗しますので、NEOに限界の値の処理を渡す処理は、必要だと思います…。

これはサーバ側の問題でもありますが、POSTを行うアプリである以上避ける事ができない問題だと思います。

ただ、8MBを超えるような大きなpchファイルを作る人はあまり多くいないので、作画時間が10時間以上の場合に投稿が不可能になるケースがあるというだけとはいえるのですが。
逆にこの場合は作画時間が作画時間だけに、投稿できませんでは困るし、サーバの受信可能サイズが20MBでは足りないなら50MBにすれば良いのかいうと、それも問題があると思います。

たとえば、8MBが上限でも20MBが上限でも、それはサーバで設定をあげていけば投稿が可能にはなりますが、
手入力であるにせよ、phpによる自動取得であるにせよ、何MB以上は送信できませんよとneoに知らせる機能が必要で、その状態で20MBのpchファイル(今回実際に発生)が生成されると、画像を含むすべてが投稿不可能になる問題は回避する必要があると思います。

pchは、psdのようにレイヤーを結合すれば容量が減るわけではなく、動画は追記していくと増えますから切り捨てる選択肢がなければ、投稿不可能な状態が発生します。

しかし、
pch、png画像、ヘッダ等を、neo.js以外から、neoの送信ボタンを押したタイミングで取得できるなら、掲示板側で用意したfetchで受信とエラー処理をすればすむ事になります。
たとえば、
https://github.com/satopian/Petit_Note/blob/master/petitnote/template/basic/paint_tegaki.html
のような形です。
この場合は、fetchの送信処理を、テンプレート内のJavaScriptが受け持っています。
このような処理に移行できる場合は、送信に関するサポートをneo.jsでは行わないようにする事ができると思います。
ただ、neoのどのタイミングで、掲示板側でfetchできるようになるのかは調べてみないと私にもわかりません…。
マージできるできないは判断していただくしかないのですが、掲示板に付属した形で配布するneo.jsはこのプルリクエストのものとほぼ同じものになります。
こちらで改造版を配って使う形にしたほうがよければそうします。
また、私の事ですのでまた何かミスしている可能性はありますが、すでに実際に使用中ではありますので、それも含めて判断材料にしていただけるようでしたら幸いです。

サポート掲示板でのやりとりのリンクも参考のため、追記しておきます。
https://paintbbs.sakura.ne.jp/cgi/neosample/support/?resno=102

@satopian

Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

もし post_max_size をすでに超えている場合、PHPはPOSTデータを処理する前にそのサイズをチェックし、超過している場合は処理を中止し、$_POST および $_FILES スーパーグローバル変数にはデータが格納されません。そのため、PHP側で個別のファイルを拒否する前に、すでにPOSTデータの合計サイズが制限を超えているかどうかをチェックすることは難しいです。

一般的に、ファイルのアップロードやPOSTデータの処理を行う前に、クライアント側でJavaScriptを使用してファイルのサイズを制限し、サーバーに送信されるデータの量を制御することが推奨されます。

これを把握するのに、私もかなり時間がかかりましたので、貼っておきます。
この回答はチャットGPTによるものです。(参考例として)
XAMPPで設定を何度も変更して試しましたが、post_max_sizeをオーバしている場合は、JavaScript側の対応がなければPHPではどうする事もできませんでした。
PHP側ではPOSTの最大サイズを超えた時点で、画像だけを受け取って、PCHは切り捨てるといった事はできないようです。
POSTの合計の最大サイズを超えた時点ですべてのPOSTが停止して、拡張ヘッダも、画像も送信されません。
((ヘッダサイズ+画像+PCH)<max_pch)の時だけ、PCHデータファイルを添付するようにして、この問題を回避してみたのが、今回のプルリクエストの内容になります。

@satopian

Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

neoのCanvasの描画に関する事など、こちらでは対応不能な事についてはIssueを開いて、それ以外の対応可能な修正・改造はこちらでやる事にしました。
私には、Canvasに関する問題でトラブルが発生しても解決する事がたぶんできないので、そういったどうしてもfunigeさんに頼らざるを得ない問題はhunigeさんに頼りそれ以外は自分で解決する事にします。
そうしないと、これはお願いしないとどうにもならないという時以外にもfunigeさんに負担がかかるからです。
という事で、プルリクエストを閉じます。
ただ、そうした独自拡張したものを今後も配布していく事にはなりますので、ご了承ください。

@satopian satopian closed this Feb 12, 2024
@funige

Owner

funige commented Feb 13, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

対応遅くなって申し訳ありません。
プログラムができないのは何年も前からなのですが、最近は体調も悪く、
PCを開くこともできずに終わる日が多くて非常に不義理な感じになってます。
まだ死ぬことはないと思いますが、そろそろ死んだ後のことも考えないといけないなあと考え始めております。

あまり返事お待たせするのも申し訳ありませんので、satopianさんをcollaboratorに追加して、mergeの権限追加しておきます。
問題あれば前のバージョンに戻せばいいだけなので、あまり気にせずにmergeしてください。

@funige

Owner

funige commented Feb 13, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

このプルリクエストに関しては、とりあえず(closeして頂いて恐縮なのですが)
自分がmasterにマージしましたので、どうか宜しくお願いします。

バージョンはv1.6.1のままです。

@satopian

Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more about hiding comments.

@funige いろいろとすみません。
わかりました。

Update branch attempt failed

Oops, something went wrong.

@funige

Add a comment

Select a reply

Slash commands
Beta
Give feedback
Slash commands
Beta
Give feedback

An unexpected error has occurred

Remember, contributions to this repository should follow our GitHub Community Guidelines.
ProTip! Add comments to specific lines under Files changed.
Labels
Apply labels to this pull request
None yet
Projects
Projects
None yet
Development
Link an issue from this repository

Successfully merging this pull request may close these issues.

None yet

2 participants
Lock conversation

Lock conversation on this pull request

  • Other users can’t add new comments to this pull request.
  • You and other collaborators with access to this repository can still leave comments that others can see.
  • You can always unlock this pull request again in the future.

Optionally, choose a reason for locking that others can see. Learn more about when it’s appropriate to lock conversations.

サーバのPOSTの上限を超えるPOST時に動画、画像ともに投稿に失敗する問題 by satopian · Pull Request #100 · funige/neo