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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

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

解決済

1回答

1338閲覧

任意のエラーメッセージの表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

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クリップ

投稿2022/11/02 02:58

編集2022/11/02 04:39

前提

個人情報の登録画面をつくっています。
save15の項目を入力すると別紙出力に移行する形になり、zipファイルに別紙がダウンロードされる仕組みです
(別紙出力は別紙出力ボタンで出力)

現状 → zipを開くと圧縮フォルダーエラーがでる(フォルダを開くことができません)

controller PHPでzipファイルの中身(excel)作成しています。
条件 → save15が入力されれば、Excelの作成、未入力の場合Excelの作成はしない

HTMLでボタンクリック後、zipファイルは作成させる

save15入力済み処理は完成している
save15は未入力の場合、zipファイルを開くと任意のエラーメッセージ(入力データがありません)を表示させたい。

実現したいこと

save15は未入力の場合、zipファイルを開くと任意のエラーメッセージ(入力データがありません)を表示させたい。
blob形式でエラーをreturnさせたい

該当のソースコード

php

1 public function besshi(Request $request) { 2 $login_id = Auth::user()->login_id; 3 $st_id = $request->support_id; 4 $excel_dir = storage_path('temp/excel/login_' . $login_id . '/別紙'); 5 $zip_file = storage_path('temp/zip/login_' . $login_id. '/別紙.zip'); 6 $response = ''; 7 $save = Document::where('login_id', Auth::user()->login_id) 8 ->where('st_id', $st_id) 9 ->where('document_id', $request['document_id']) 10 ->first(); 11 12 if($save != null && ($save['save_15'] !== "")){ 13 // 作業用ディレクトリの存在チェック 14 if(File::missing($excel_dir) && File::missing($zip_file)) { 15 // excel保存ディレクトリを作成 16 File::makeDirectory($excel_dir, 0777, TRUE); 17 // zipファイルを作成して開く 18 $zip = new \ZipArchive(); 19 $zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); 20 // phpSpreadsheetの準備 21 $reader = IOFactory::createReader('Xlsx'); 22 $spreadsheet = $reader->load('assets/Excels/別紙.xlsx'); 23 $sheet = $spreadsheet->getActiveSheet(); 24 25 // 一時保存データを取得 26 if($save){ 27 $sheet->setCellValue('H35',$save['save_13']); 28 $sheet->setCellValue('C37',$save['save_14']); 29 $sheet->setCellValue('C46',$save['save_15']); 30 $sheet->setCellValue('H46',$save['save_16']); 31 32 // excelファイルを保存してzipファイルに追加 33 $filepath = $this->uniqueFilePath($zip, '別紙.xlsx'); 34 $fullpath = $excel_dir . '/' . $filepath; 35 $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); 36 $writer->save($fullpath); 37 $zip->addFile($fullpath, $filepath); 38 } 39 // $spreadsheetを解放 40 $spreadsheet->disconnectWorksheets(); 41 $spreadsheet->garbageCollect(); 42 unset($spreadsheet); 43 // Zipファイルを閉じる 44 $zip->close(); 45 // response生成 46 $response = response(File::get($zip_file))->header('Content-Type', 'application/zip'); 47 // excel保存ディレクトリを削除 48 File::deleteDirectory($excel_dir); 49 // zipファイルを削除 50 File::delete($zip_file); 51 } 52 return $response; 53 } 54 } 55 56 57 58```html 59 // 出力 60 $('#besshi').on('click', function(e) { 61 const documentId = $('#reg_Document').attr("document_id"); 62 const sr_id = $('select[name="st_select"] option:selected').val(); 63 $.ajax({ 64 url: '/intern/besshi', 65 type: 'POST', 66 data: { 67 document_id: documentId, 68 st_id: sr_id, 69 _token: $('input[name="_token"]').val(), 70 }, 71 xhrFields: { 72 responseType: 'blob' 73 }, 74 beforeSend: function() { 75 $('#loading').show(); 76 }, 77 success: function(response) { 78 $('#loading').hide(); 79 var blob2 = new Blob([response]); 80 var link = document.createElement('a'); 81 link.href = window.URL.createObjectURL(blob2); 82 link.download = "別紙.zip"; 83 link.click(); 84 }, 85 error: function(request, status, error) { 86 $('#loading').hide(); 87 alert(request.responseText + 'status: ' + status + 'error: ' + error); 88 } 89 }); 90 }); 91 92 93### 試したこと 94 95controller 96~~ 97 // $spreadsheetを解放 98 $spreadsheet->disconnectWorksheets(); 99 $spreadsheet->garbageCollect(); 100 unset($spreadsheet); 101 // Zipファイルを閉じる 102 $zip->close(); 103 // response生成 104 $response = response(File::get($zip_file))->header('Content-Type', 'application/zip'); 105 // excel保存ディレクトリを削除 106 File::deleteDirectory($excel_dir); 107 // zipファイルを削除 108 File::delete($zip_file); 109 } 110 return $response; 111 } 112 return response()->json(['empty' => true]); 113 } 114 115フロント側 116~~~ 117 success: function(response) { 118 $('#loading').hide(); 119 console.log(response); 120 if(response.empty){ 121 return false; 122 } 123 var blob2 = new Blob([response]); 124 125と記述したところblobで返ってくる予定がjsonで返ってきているのでエラー 126 127

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

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

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

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

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

guest

回答1

0

ベストアンサー

fetchで受け取ってtypeで判断してみては?

javascript

1fetch(url).then(res=>res.blob()).then(b=>{ 2 if(b.type=="application/json") throw new Error('json'); 3 console.log(b); 4}).catch(err=>{ 5 console.error(err); 6});

投稿2022/11/02 03:29

編集2022/11/02 03:30
yambejp

総合スコア114843

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

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

退会済みユーザー

退会済みユーザー

2022/11/02 04:33

xhrFields: { responseType: 'blob' }, で、はじかれてしまい別の方法で実装いたしました。ご回答いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問