編集:わかりました、コンテンツタイプヘッダーを multipart/form-data に設定しましたが、違いはありません。私の元の質問は以下のとおりです。
これは、スタック オーバーフローに関する私の最初の質問です。正しくできていることを願っています。
最近スタンフォード コースのオンライン バージョンを修了したので、Objective-C だけを学んでいます。私はphpとhtmlについてほとんど何も知りません。私が使用しているphpスクリプトとhtmlは、ほとんどがチュートリアルからコピーされています。私には Obj-C の方が理にかなっています。
問題:
私はphpスクリプトを持っています。画像ファイルをアップロードします。サーバー上の同じフォルダーにある html ファイルから呼び出すと、正しく動作します。obj-c から呼び出されたときに同じスクリプトを動作させようとしています。実行されているようで、200 が返されます。obj-c は php を呼び出しますが、オンライン フォルダーにファイルが表示されません。
これは ios7 でのみ導入されたため、Web 上ではほとんどないようです。私が見つけた例はファイルのアップロードを扱っていません。それらはすべてダウンロードを扱っており、アップロードは似ていると言っているだけです。私が行ったことは、私が見つけたチュートリアルを満たすようです。
私が知っていることは次のとおりです。
- サーバー上のhtmlファイルから呼び出されると、phpが機能し、ファイルがアップロードされます
- obj-c は間違いなく php スクリプトを呼び出しています (obj-c を実行したときにスクリプトが呼び出されていることを確認するために、(file_put_contents を使用して) いくつかのログを php に書き込みました)
- obj-c はほぼ確実に画像ファイルをアップロードしています (obj-c でデリゲート メソッドを使用すると、アップロードの進行状況が表示されます)
- しかし、phpスクリプトはファイルを受信していません(私がphpに書き込んだロギングは、obj-cから呼び出されたときに$ _FILESに値がないことを示しています.htmlから呼び出された場合、期待どおりに動作します)
- 受信したヘッダーをログに記録するように php を編集したところ、画像ファイルの Content-Length が取得されます。
重要なこと:
- 私はhtmlヘッダーを追加していません。私が見たチュートリアルでは、(NSURLSessionUploadTaskを使用して)そうしなければならないと言っています。NSURLSessionUploadTaskがこれを整理すると思いますか?それともこれは私の問題ですか?
- [応答の説明] は 200 を返します。引用符: { URL: (PHP スクリプトの URL) } { ステータス コード: 200、ヘッダー { "Content-Type" = "text/html"; Date = "Thu, 16 Jan 2014 19:58:10 GMT"; "キープアライブ" = "タイムアウト = 5、最大 = 100"; サーバー = アパッチ; 「転送エンコーディング」= ID; } }
- HTML は enctype="multipart/form-data" を指定していますが、おそらくこれを私の obj-c のどこかに組み込む必要がありますか?
- これまでのところ、シミュレーターからのみ実行しています
- どんな助けでも大歓迎です!ありがとう :)
- 編集、以下のコードを編集して、元々持っていた [request setHTTPMethod:@"PUSH"] の代わりに [request setHTTPMethod:@"POST"] を表示しましたが、変更はありません。
これが目標Cです
- (void) uploadFile: (NSURL*) localURL toRemoteURL: (NSURL*) phpScriptURL
{
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:phpScriptURL];
[request setHTTPMethod:@"POST"];
NSURLSessionUploadTask* uploadTask = [defaultSession uploadTaskWithRequest:request fromFile:localURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){
if (error == nil)
{
NSLog(@"NSURLresponse =%@", [response description]);
// do something !!!
} else
{
//handle error
}
[defaultSession invalidateAndCancel];
}];
self.imageView.image = [UIImage imageWithContentsOfFile:localURL.path]; //to confirm localURL is correct
[uploadTask resume];
}
これがサーバー上のPHPスクリプトです
<?php
$file = 'log.txt';
$current = file_get_contents($file);
$current .= $_FILES["file"]["name"]." is being uploaded. "; //should write the name of the file to log.txt
file_put_contents($file, $current);
ini_set('display_errors',1);
error_reporting(E_ALL);
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
//&& ($_FILES["file"]["size"] < 100000) //commented out for error checking
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
if (move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]))
{
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
else
{
echo "Error saving to: " . "upload/" . $_FILES["file"]["name"];
}
}
}
}
else
{
echo "Invalid file";
}
?>
同じスクリプトを呼び出すときに期待どおりに機能するhtmlファイルは次のとおりです
<html>
<body>
<form action="ios_upload.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="Submit">
</form>
</body>