質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

209閲覧

特定の Andoroid スマートフォンからのみ、xhrhttprequest で 動画をアップロード出来ない状態を解消したい

jmt

総合スコア12

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2024/04/22 04:33

実現したいこと

特定の Andoroid スマートフォンからのみ、xhrhttprequest で 動画をアップロード出来ない状態を解決したい

前提

特定の Android のスマートフォン実機からのみ、動画ファイルを xhrhttprequest で送信できません。
PC、iOS スマートフォン実機、その他の Android のスマートフォン実機 からは同じ動画ファイルを同じコードで送信出来ています。

発生している問題・試したこと

手元に対象エラーが起こっている実機が無く、別担当の方のテストAndroid実機でのみ再現する状況です。どうやら新しい Android OS だと失敗する傾向が見えていますが、家族に借りた 新しいAndroid 実機(OSバージョンを控えていませんでした)でテストすると成功しているので、必ず失敗する訳でも無いようです。

その担当の方に依頼して、USBで実機をPC接続し、Chrome デベロッパーツールでのデバッグを行ったものの、特に不明なデータも見つけられず、手詰まり感のある状態です。

同様のご経験などある方がいらっしゃいましたら、ヒント等、些細な事でもご教示頂けないでしょうか。
どうぞ、よろしくお願い致します。

追記

次の情報に沿って、php.ini の設定を見直してみましたが、状況は変わりませんでした。念のため、関連値も記載しておきます。
https://stackoverflow.com/questions/69103334/xmlhttprequest-file-upload-not-working-on-mobile

memory_limit => 2G upload_max_filesize => 2G max_input_vars => 1000 max_execution_time => 0 ; post_max_size = 8M (変更前) post_max_size = 64M (変更後)

送信コード(Javascript)

// 関連箇所のみ抜粋 var xhr = new XMLHttpRequest(); var fd = new FormData(); fd.append('upfile', upfile); // upfile = アップロードする動画ファイル ---① xhr.onreadystatechange = function() { if( (xhr.status == 200 || xhr.status == 304) && xhr.response) { var data = xhr.response; console.log( 'COMPLETE! :' ); console.log( data ); } else { console.log( 'Failed. HttpStatus: '+xhr.status ); } }; xhr.open('POST', '/api/video/upload', true); xhr.responseType = 'json'; xhr.send(fd);

送信ログ(Javascript)

送信直前の上記、---①の箇所で、処理を止めて確認した upfile のデータです。
この時点では、ファイルデータが upfile に入っています。

# upfile lastModified: 1713564962045 lastModifiedDate: Sat Apr 20 2024 07:16:02 GMT+0900 (日本標準時) [[Prototype]]: Object name: "VID_2024-04-20-07-15-56-811.mp4" size: 10950674 type: "video/mp4" webkitRelativePath: ""

受信コード(cakePHP3.8)

//src\Controller\Api\VideosController.php public function upload(){ // 失敗する端末からの送信時は、すでにこの時点でデータを取得出来ていない $this->appInfoLog("api.videos.upload", ["request"=>$this->request, "_FILES"=>$_FILES, ] ); // 以下アップロード処理 // ... }

受信ログ(cakePHP3.8)

成功時 _FILESにデータが入っています。

2024-04-20 05:53:13 Info: {"request":{"trustProxy":true},"_FILES":{"upfile":{"name":"VID_20240419_155656.mp4","type":"video\/mp4","tmp_name":"\/tmp\/phpAu0ege","error":0,"size":7330740}},"action":"api.videos.upload"}

失敗時 _FILESが空です。

2024-04-20 06:31:52 Info: {"request":{"trustProxy":true},"_FILES":[],"action":"api.videos.upload"}

補足情報(FW/ツールのバージョンなど)

サーバー

・CentOS Linux 7
・nginx 1.20.1

フロントエンド

・Javascript

バックエンド

・PHP 7.3
・cakephp 3.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2024/04/22 05:29

とりあえず通常のPOSTでアップロードに問題ないか確認してみてください
jmt

2024/04/22 05:40

コメントありがとうございます。担当の方にテストして頂きましたが、動画ではない、通常の画像ファイルは POST 出来ました。
jmt

2024/04/22 05:44 編集

先ほど、php.ini の max_input_vars => 1000 を  max_input_vars => 2000 に変更したら、 動画アップロード成功したと連絡が来ました。
jmt

2024/04/22 05:48

ただし、現状のこの設定で1秒程度の動画はOKだが 5秒だとNGとのこと。post_max_size をもっと増やす、、、? memory_limit => 2G upload_max_filesize => 2G max_input_vars => 2000 max_execution_time => 0 post_max_size = 64M
guest

回答2

0

通常POSTサイズの不足の場合「Fatal error: Allowed memory size of xxx」のようなエラーが出ますが、状況はどうなのでしょうか?

post_max_sizeを変更する場合は一緒に、upload_max_filesizeやmemory_limitも増やしてみてください

投稿2024/04/22 06:12

yambejp

総合スコア114883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jmt

2024/04/22 06:23

ありがとうございます。 この値にして、有効化してみたのですが、5秒程度の動画が上がらないとのこと、、、 memory_limit => 2G upload_max_filesize => 2G max_input_vars => 4000 max_execution_time => 0 post_max_size = 2G ログについては、cakephp の エラーログにはご指摘の Fatal error は出ていませんね。 確かに、この場合は、通常はご指摘のエラーログが出ますよね、、、 cakephp のエラーログなので、出ないのかもと思い、通常の php エラーログを有効化しようとしているのですが、なぜかなかなか出るようにならず。 はじめての構成です。 centos 7 nginx php7.3 (remi インストール) nginx なので、php-fpm の方の www.conf を編集して php-fpm を再起動もしたのですが、、、出ず。もう少し調べます。
jmt

2024/04/22 06:42

元々のPHPエラーログが出ないのは、ディレクトリ権限の問題でした、、、失礼いたしました。 やはり、こちらのログに出ていました。 PHP Warning: POST Content-Length of 14644009 bytes exceeds the limit of 8388608 bytes in Unknown on line 0 php.ini に 設定した post_max_size の 2G は効いていないみたいです。 有効な設定場所を探します。
yambejp

2024/04/22 07:00

nginxには詳しくないのでなんと言えませんが、apacheでいうLimitRequestBody設定 <Files *.php> LimitRequestBody 0 </Files> nginx.confにて http { client_max_body_size 2g; } が必要かもしれません
jmt

2024/04/22 08:47

ありがとうございます。まさにこの項目でした!
guest

0

自己解決

最終的に、/etc/nginx/conf.d/*.conf (*はサービス名称) 内に、
client_max_body_size の項目を追加する事で解決致しました。
Android スマートフォンの Js からの動画ファイル送信時は、iOS や PC(Windows) から送信時より何故かサイズが膨れ上がっているという事になりそうですね。

@yambejp 様、コメント頂きありがとうございました。画像アップロードの確認をきっかけに、偶然短い動画のアップロードが成功する事が発見されたみたいです。

行った事
・cakephp のログだけでなく、PHPのデフォルトのログを出力して確認した(出力設定がされていなかった)
・php-fpm 設定ファイル、nginx の 設定ファイル の POST に関連する値を修正した
・php-fpm, nginx の再起動

/etc/opt/remi/php73/php-fpm.d/www.conf

php

1memory_limit => 2G 2upload_max_filesize => 2G 3max_input_vars => 2000 4max_execution_time => 0 5post_max_size = 500MB 6

/etc/nginx/conf.d/*.conf (*はサービス名称)

server { listen 80; server_name www.example.com; // 追加 client_max_body_size 500MB; }

php-fpm, nginx の再起動

systemctl restart php73-php-fpm.service systemctl reload nginx

投稿2024/04/22 07:48

編集2024/04/23 01:37
jmt

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2024/04/22 07:57

PHPはほぼ一体といえるくらいapacheへの親和性がたかく、逆にnginxだと使い勝手がわるいかもしれないですね。 nginxを前提とするならもっと別な言語も視野に入れたほうがよいかもしれません。
jmt

2024/04/22 08:51

コメントを頂いていたようで、気づかず申し訳ございませんでした。 まさに、コメントでご指摘頂いた部分がネックになっていたようです。 私も今まで apache を多く使っていましたが、今回、nginx を使う事になり、 conf ファイルが沢山あったり再起動が php-fpm だったりと少々勝手が違いますね。 伴走いただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問