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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

2回答

7306閲覧

swiftにて画像アップロード(サーバ上へ)

Tsubasa283

総合スコア27

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

PHP

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

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2016/08/14 11:52

以前に質問した内容に近いのですが、またご教授いただければ幸いです。

下記のサイトを参考にしながら、ファイルのアップロードをしたいと考えております。
【Swift】Swift + PHPでiOSから画像をアップロードする

シミュレータ上では、動作はしているのですが、画像が指定したファイル(/Applications/MAMP/htdocs/uploadfile)に保存されておりません。
エラーのメッセージも出ずで、どのように対応したらいいのかご教授いただければ幸いです。

swift

1 2import UIKit 3 4class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 5 @IBOutlet weak var myImageView: UIImageView! 6 var imageForUpload: UIImage! 7 8 @IBOutlet weak var imageview: UIImageView! 9 override func viewDidLoad() { 10 super.viewDidLoad() 11 12 override func didReceiveMemoryWarning() { 13 super.didReceiveMemoryWarning() 14 } 15 16 @IBAction func uploadButtonTapped(sender: AnyObject) { 17 myImageUploadRequest() 18 } 19 20 @IBAction func selectPhotoButtonTapped(sender: AnyObject) { 21 let myPickerController = UIImagePickerController() 22 myPickerController.delegate = self; 23 myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 24 25 self.presentViewController(myPickerController, animated: true, completion: nil) 26 } 27 //画像のアップロード処理 28 func myImageUploadRequest(){ 29 30 //myUrlには自分で用意したphpファイルのアドレスを入れる 31 let myUrl = NSURL(string:"http://http://localhost/upload.php") 32 let request = NSMutableURLRequest(URL:myUrl!) 33 request.HTTPMethod = "POST" 34 //下記のパラメータはあくまでもPOSTの例 35 let param = [ 36 "userId" : "1234" 37 ] 38 39 let boundary = generateBoundaryString() 40 41 request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 42 43 let imageData = UIImageJPEGRepresentation(self.imageForUpload, 1) 44 45 if(imageData==nil) { return; } 46 request.HTTPBody = createBodyWithParameters(param, filePathKey: "file", imageDataKey: imageData!, boundary: boundary) 47 48 //myActivityIndicator.startAnimating(); 49 let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 50 data, response, error in 51 if error != nil { 52 print("error=\(error)") 53 return 54 } 55 // レスポンスを出力 56 print("******* response = \(response)") 57 let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 58 print("****** response data = \(responseString!)") 59 60 dispatch_async(dispatch_get_main_queue(),{ 61 //アップロード完了 62 }); 63 } 64 task.resume() 65 66 } 67 func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData { 68 let body = NSMutableData() 69 if parameters != nil { 70 for (key, value) in parameters! { 71 body.appendString("--\(boundary)\r\n") 72 body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 73 body.appendString("\(value)\r\n") 74 } 75 } 76 let filename = "user-profile.jpg" 77 let mimetype = "image/jpg" 78 body.appendString("--\(boundary)\r\n") 79 body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n") 80 body.appendString("Content-Type: \(mimetype)\r\n\r\n") 81 body.appendData(imageDataKey) 82 body.appendString("\r\n") 83 body.appendString("--\(boundary)--\r\n") 84 return body 85 } 86 87 func generateBoundaryString() -> String { 88 return "Boundary-\(NSUUID().UUIDString)" 89 } 90 91 //カメラで写真を取る 92 func pickImageFromCamera() { 93 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) { 94 let controller = UIImagePickerController() 95 controller.delegate = self 96 controller.sourceType = UIImagePickerControllerSourceType.Camera 97 self.presentViewController(controller, animated: true, completion: nil) 98 } 99 } 100 101 //写真をライブラリから選択 102 func pickImageFromLibrary() { 103 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) { 104 let controller = UIImagePickerController() 105 controller.delegate = self 106 controller.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 107 self.presentViewController(controller, animated: true, completion: nil) 108 } 109 } 110 //画像が選択されたら呼び出される 111 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 112 if info[UIImagePickerControllerOriginalImage] != nil { 113 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 114 115 //iamgeForUploadというUIImageを用意しておいてそこに一旦預ける 116 self.imageForUpload = image 117 self.myImageUploadRequest() 118 } 119 picker.dismissViewControllerAnimated(true, completion: nil) 120 } 121} 122 extension NSMutableData { 123 func appendString(string: String) { 124 let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 125 appendData(data!) 126 } 127 }

以下ファイルは、/Applications/MAMP/htdocs/upload.phpとして、おいております。

php

1 2<?php 3$userId = $_POST["userId"]; 4 5//下記のディレクトリ名は好きなものでOK 6$target_dir = "/uplodafile"; 7if(!file_exists($target_dir)) 8{ 9mkdir($target_dir, 0777, true); 10} 11 $target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]); 12 13if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) { 14echo json_encode([ 15"Message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.", 16"Status" => "OK", 17"userId" => $_POST["userId"] 18]); 19 20} else { 21 22echo json_encode([ 23"Message" => "Sorry, there was an error uploading your file.", 24"Status" => "Error", 25"userId" => $_POSt["userId"] 26]); 27} 28?>

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

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

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

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

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

guest

回答2

0

ベストアンサー

載せているコードがmultipartを利用したやり方でしたが、簡単に画像だけをアップロードしたいのでしたら以下のサイトを参考にしたほうが解決が早いかもしれません。

Swift Docs 009 ファイルのアップロード

自分はphpは全く分かりませんが、以下の様にすることで取り合えず画像はアップロードできました。
まず最低限動くものを作ってからアレンジしたほうが近道かもしれませんね。

MAMPの設定はポートのApacheポートを80にしました。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 let image = UIImage(named: "swift")! 9 10 let url = NSURL(string: "http://localhost:80/upload.php")! 11 let request = NSMutableURLRequest(URL: url) 12 request.HTTPMethod = "POST" 13 14 let imageData = UIImageJPEGRepresentation(image, 1.0)! 15 16 let session = NSURLSession.sharedSession() 17 let tasK = session.uploadTaskWithRequest(request, fromData: imageData) { (data, response, error) in 18 19 print(NSString(data: data!, encoding: NSUTF8StringEncoding)) 20 21 if let error = error { 22 print(error.description) 23 } 24 } 25 tasK.resume() 26 } 27}

upload.php

php

1 2<?php 3 // リクエストBodyからファイルのデータを取得. 4 $image = file_get_contents("php://input"); 5 6 // 取得したバイナリデータを画像(png)として保存. 7 file_put_contents('dl.png',$image); 8?>

質問されているコードで実行

以下のコードで問題なくMAMPのフォルダに指定したフォルダが作られて画像がアップロードされました。
やはりMAMPのサーバーに問題なく繋がることを確認してから該当サイトのコードを試すほうが確実なような気がします。

ViewController.swift

swift

1import UIKit 2import Foundation 3 4extension NSMutableData { 5 func appendString(string: String) { 6 let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true) 7 appendData(data!) 8 } 9} 10 11class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate{ 12 13 // 画面にUIImageViewを配置 14 @IBOutlet weak var imageForUpload: UIImageView! 15 16 // Photo Libraryを開く為のボタンアクションを追加 17 @IBAction func openLibrary(sender: UIButton) { 18 pickImageFromLibrary() 19 } 20 21 22 23 // ---------- 以下はアクセスするサイトURL以外は変更なし ------------ 24 25 26 27 28 //UIImagePickerControllerDelegate, UINavigationControllerDelegateを忘れずに 29 //画像のアップロード処理 30 func myImageUploadRequest(){ 31 //myUrlには自分で用意したphpファイルのアドレスを入れる 32 let myUrl = NSURL(string: "http://localhost:80/upload.php")! 33 let request = NSMutableURLRequest(URL:myUrl) 34 request.HTTPMethod = "POST" 35 //下記のパラメータはあくまでもPOSTの例 36 let param = [ 37 "userId" : "12345" 38 ] 39 let boundary = generateBoundaryString() 40 request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type") 41 let imageData = UIImageJPEGRepresentation(self.imageForUpload.image!, 1) 42 if(imageData==nil) { return; } 43 request.HTTPBody = createBodyWithParameters(param, filePathKey: "file", imageDataKey: imageData!, boundary: boundary) 44 let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 45 data, response, error in 46 if error != nil { 47 print("error=\(error)") 48 return 49 } 50 // レスポンスを出力 51 print("******* response = \(response)") 52 let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 53 print("****** response data = \(responseString!)") 54 dispatch_async(dispatch_get_main_queue(),{ 55 //アップロード完了 56 }); 57 } 58 task.resume() 59 } 60 func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData { 61 let body = NSMutableData() 62 if parameters != nil { 63 for (key, value) in parameters! { 64 body.appendString("--\(boundary)\r\n") 65 body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n") 66 body.appendString("\(value)\r\n") 67 } 68 } 69 let filename = "user-profile.jpg" 70 let mimetype = "image/jpg" 71 body.appendString("--\(boundary)\r\n") 72 body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n") 73 body.appendString("Content-Type: \(mimetype)\r\n\r\n") 74 body.appendData(imageDataKey) 75 body.appendString("\r\n") 76 body.appendString("--\(boundary)--\r\n") 77 return body 78 } 79 func generateBoundaryString() -> String { 80 return "Boundary-\(NSUUID().UUIDString)" 81 } 82 //カメラで写真を取る 83 func pickImageFromCamera() { 84 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) { 85 let controller = UIImagePickerController() 86 controller.delegate = self 87 controller.sourceType = UIImagePickerControllerSourceType.Camera 88 self.presentViewController(controller, animated: true, completion: nil) 89 } 90 } 91 92 //写真をライブラリから選択 93 func pickImageFromLibrary() { 94 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) { 95 let controller = UIImagePickerController() 96 controller.delegate = self 97 controller.sourceType = UIImagePickerControllerSourceType.PhotoLibrary 98 self.presentViewController(controller, animated: true, completion: nil) 99 } 100 } 101 //画像が選択されたら呼び出される 102 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 103 if info[UIImagePickerControllerOriginalImage] != nil { 104 let image = info[UIImagePickerControllerOriginalImage] as! UIImage 105 //iamgeForUploadというUIImageを用意しておいてそこに一旦預ける 106 self.imageForUpload.image = image 107 self.myImageUploadRequest() 108 } 109 picker.dismissViewControllerAnimated(true, completion: nil) 110 } 111}

upload.php

php

1<?php 2$userId = $_POST["userId"]; 3//下記のディレクトリ名は好きなものでOK 4$target_dir = "wp-content/uploads/2015/02"; 5if(!file_exists($target_dir)) 6{ 7mkdir($target_dir, 0777, true); 8} 9 10$target_dir = $target_dir . "/" . basename($_FILES["file"]["name"]); 11 12if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_dir)) { 13echo json_encode([ 14"Message" => "The file ". basename( $_FILES["file"]["name"]). " has been uploaded.", 15"Status" => "OK", 16"userId" => $_POST["userId"] 17]); 18 19} else { 20 21echo json_encode([ 22"Message" => "Sorry, there was an error uploading your file.", 23"Status" => "Error", 24"userId" => $_POSt["userId"] 25]); 26} 27?>

投稿2016/08/15 03:42

編集2016/08/15 06:43
_Kentarou

総合スコア8490

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

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

Tsubasa283

2016/08/20 07:57

連絡が遅くなり大変申し訳ございません。返信ありがとうございます。 上記コードにて、ファイルアップロードすることであればうまく機能しました。 今回の質問で試してみたのですが、以下エラーメッセージでした。 エラー修正して、再度チャレンジしてみます。ご回答ありがとうございました。 ****** response data = {"Message":"Sorry, there was an error uploading your file.","Status":"Error","userId":null}
guest

0

このURLは恐らく間違いだと思います。
let myUrl = NSURL(string:"http://http://localhost/upload.php")

エラーログが出ないというのであれば、どの行までは正しく実行されるのかを順番に確かめるしかないと思います。

投稿2016/08/15 02:50

YasuhiroMiyake

総合スコア1336

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

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

Tsubasa283

2016/08/20 08:00 編集

コメントありがとうございます。 連絡が遅くなり申し訳ありません。 ご指摘の通り、URLが誤っておりました。修正いたしました。 上記で書いたエラーが出てきておりますので、デバックも勉強中ですが、少しずつチャレンジしてまいります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問