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

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

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

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

3774閲覧

Laravel5.5を使ってAjaxでサーバにファイルをアップロードしたいが、IISで405が返ってくる

nnahito

総合スコア2004

IIS

IIS(Internet Information Services)はマイクロソフト社によって開発されたwebサーバーです。Windows上で動作します。

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/11/14 16:45

はじめに

Laravel初心者です

質問概要

jqueryのajaxを使って、ファイルがドラッグされたらサーバにアップロードしたい。
しかし、405レスポンスが返ってくる。

質問

前回の質問で、ファイルをドラッグ・アンド・ドロップでサーバにAjax通信でファイルをアップロードすることができました。

その開発環境が、

  • Windows10
  • Larabel5.5
  • XAMPP
  • PHP 7.1.4 (cli)

なのですが、これを本番環境のサーバ

  • Windows Server 2016
  • IIS10
  • PHP 7.1.6 (cli)

にコピー(デプロイ?)したところ、開発環境(XAMPP)では正常にアップロードできていたものが、
何故か405エラー(Method Not Allowed)が返ってきます。
LaravelはIISに対応してない……というわけではないと思いますが、
何故このような現象が起こるのでしょうか?

ご存じの方がいらっしゃいましたら、ご教示いただけますと幸いです。

コード


ルーター(web.php)

php

1/** 2 * 管理ページ 3 * ファイルのアップロード 4 */ 5Route::match(['post'], '/admin/file/upload/', 'AdminController@fileUpload')->middleware('articlepost');

ミドルウェアは、パスワード処理系の為省略


コントローラー(AdminController.php)

php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\User; 6 7use Illuminate\Http\Request; 8use Session; 9use App\Http\Controllers\Controller; 10use App\Model\Dao\ArticleDao; 11use Illuminate\Support\Facades\Storage; 12 13 14/** 15 * articleページのコントローラー 16 */ 17class AdminController extends Controller 18{ 19 20// 中略 21 22 /** 23 * ファイルのアップロード時に通るコントローラー 24 * 25 * @author Nな人<nnahito> 26 * @return view 27 */ 28 public function fileUpload(Request $request) { 29 30 // ファイルが来ているかのチェック 31 if ( $request->hasFile('file') !== true ) { 32 return response()->json(['status' => 'false']); 33 } 34 35 // 入力ファイルの取得 36 $file = $request->file('file'); 37 38 // ファイルの保存(戻り値に保存作のパス) 39 $path = $request->file('file')->store('upfiles'); 40 41 // ファイルが取得できているかのチェック 42 if ( $request->file('file')->isValid() !== true ) { 43 // 失敗ならエラー 44 return response()->json(['status' => 'false']); 45 } 46 47 // 可視性の取得 48 $visibility = Storage::getVisibility($path); 49 50 // アップロード成功ならファイルパスも返す 51 return response()->json(['status' => 'true', 'path' => $path, 'visibility' => $visibility]); 52 53 } 54 55} 56

ビューのJavaScript部分

JavaScript

1 <script> 2 3 // ページのローディングが終わったら 4 $(document).ready(function(){ 5 // テキストエリアのサイズ変更トリガーを実行 6 $('#content').trigger('autoresize'); 7 }); 8 9 10 // ブラウザ上でファイルを展開する挙動を抑止 11 function onDragOver(event) { 12 event.preventDefault(); 13 } 14 15 // Drop領域にドロップしたファイル情報を読み取り 16 function onDrop(event) { 17 // ブラウザ上でファイルを展開する挙動を抑止 18 event.preventDefault(); 19 20 // ドロップされたファイルのfilesプロパティを参照 21 var files = event.dataTransfer.files; 22 if (files.length >= 1) { 23 alert(files[0].name + ":" + files[0].size); 24 FileUpload(files[0]); 25 } 26 } 27 28 // ファイルアップロード 29 function FileUpload(f) { 30 var formData = new FormData(); 31 formData.append('file', f); 32 $.ajax({ 33 type: 'POST', 34 dataType : "json", 35 contentType: false, 36 processData: false, 37 url: '/admin/file/upload/', 38 data: formData, 39 headers: { 40 'X-CSRF-TOKEN': '{{ csrf_token() }}' 41 } 42 }).done(function(json) { 43 console.log(json); 44 var textarea = $('#content').val(); 45 $('#content').val(textarea + "\n" + json['path']); 46 47 }).fail(function(jqXHR, textStatus, errorThrown) { 48 console.log(jqXHR); 49 console.log(errorThrown); 50 alert(textStatus); 51 52 }); 53 } 54 55 </script>

IIS10で返ってくる値

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

先日の解決した質問でのIISで相対URL指定ではLaravelのルート定義が見つからないエラーになるが、urlヘルパーを使った完全なURL指定ではうまくいったという状況を元にすると、$.ajaxのurlをhttp://付きの完全なURLにすると解決するかもしれません。

またLaravelのルート定義をクライアントJavascript側でも使えるようにする以下のZiggyライブラリを使うとフロントエンド開発で少し楽が出来ます。
Ziggy: A Package for Named Laravel Routes in JavaScript
tightenco/ziggy
※上記ライブラリを使う場合は、管理画面等の不要なルート定義が漏れないようにconfig/ziggy.php を正しく設定することが必要です。

投稿2017/11/14 22:11

aro10

総合スコア4106

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

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

nnahito

2017/11/15 00:30

ご回答ありがとうございます。 ひとまず、 > 完全なURLにすると解決するかもしれません コントローラー側で、アップロード先の完全なURLをurl関数を使って生成しビューに渡して表示させると、 アップロードは正常に行われたようです。 しかし、返却れるヘッダーが「500 Internal Server Error」となりました。 詳細は「fopen(): Filename cannot be empty」とのことです。 調べてみると、どうやら以下のところでExceptionが吐かれているようです。 // ファイルの保存(戻り値に保存作のパス) $path = $request->file('file')->store('upfiles'); ファイルはLaravelのファイルが来ているかのチェックメソッドである、 $request->hasFile('file')を通過していることから、正常にサーバに上がっていると思われますが…… この原因は何なのでしょうか。
退会済みユーザー

退会済みユーザー

2017/11/15 02:37

横から失礼します。普通storeメソッドでは、laravel側が勝手にIDを作ってそれをファイル名にして保存してくれます。ですが「fopen(): Filename cannot be empty」というエラーが出ている以上、それが上手くいっていないと考えられます。原因はちょっとわからないのですが、とりあえずstoreASメゾットで上手く保存できるか試してもらえますか? 「$request->file('file')->storeAs('upfiles', 'ここに適当なファイル名');」
aro10

2017/11/15 04:57

ルート定義が解決したのであれば、後はサーバー側のファイル保存の問題かと思うのでh_3478さんのコメント等を試していけば解決できるかと思います。 Laravelのファイル権限設定に関しては、以下のkore1serverさんの記事なども参考にしてみてください。 [Laravel5.4、rsyncでデブロイする](https://kore1server.com/361)
nnahito

2017/11/15 15:31

ご回答ありがとうございます。 h_3478様の $path = $request->file('file')->store('upfiles'); でもだめで理由を探っていると、 IISのPHP7では、アップロードされたファイルは一度、C:\Windows\Tempフォルダに格納されるため、そのアクセス権限がなかったようです。 TempフォルダにISURとIIS_ISURS権限を付与すると、無事アップロードすることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問