Я новичок в PHP и Objective-C, я искал ответ на этот вопрос, но все казалось сложным, и я не мог понять. Я пытаюсь загрузить файл изображения на свой ftp-сервер с помощью PHP.
Я использовал этот код в своем приложении для загрузки изображения:
UIImage *myImage = [UIImage imageNamed:@"black_strip.png"]; NSData *imageData = UIImagePNGRepresentation(myImage); // setting up the URL to post to NSString *urlString = @"http://www.myurl.net/GagVidApp/uploadProfImage.php"; // setting up the request object now NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setHTTPMethod:@"POST"]; NSString *boundary = @"---------------------------14737809831466499882746641449"; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; [request addValue:contentType forHTTPHeaderField: @"Content-Type"]; /* now lets create the body of the post */ NSMutableData *body = [NSMutableData data]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Disposition: form-data; name=\"userfile\"; filename=\"ipodfile.png\"\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[NSData dataWithData:imageData]]; [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; // now lets make the connection to the web NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; NSLog(@"returnString: %@", returnString);
Вот мой php-код:
<?php $file = basename($_FILES['userfile']['name']); $remote_file = basename($_FILES['userfile']['name']); //$remote_file = 'readme.txt'; // set up basic connection $ftp_server = "www.myurl.net"; $ftp_user_name = "myusername"; $ftp_user_pass = "mypassword"; $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // check connection if ((!$conn_id) || (!$login_result)) { echo "FTP connection has failed!"; echo "Attempted to connect to $ftp_server for user $ftp_user_name"; exit; } else { echo "Connected to $ftp_server, for user $ftp_user_name"; } // upload a file if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) { echo "successfully uploaded $file\n"; } else { echo "There was a problem while uploading $file\n"; } // close the connection ftp_close($conn_id); ?>
Возвращаемая строка, которую я получаю в своем приложении:
returnString: Connected to www.myurl.net, for user myuser<br /> <b>Warning</b>: ftp_put(ipodfile.png) [<a href='function.ftp-put'>function.ftp-put</a>]: **failed to open stream: No such file or directory in** <b>/home/load2unet/domains/myurl.net/public_html/GagVidApp/uploadProfImage.php</b> on line <b>24</b><br /> There was a problem while uploading ipodfile.png
Я пытался найти ответ, но мне не повезло. Любая помощь будет очень высоко ценится! благодаря
Как говорит Питер, я подозреваю, что проблема заключается в неспособности ссылаться на полный путь временного файла, а именно $_FILES["userfile"]["tmp_name"]
. Здесь исполнение того, что я использовал в прошлом, используя move_uploaded_file
а не ftp, но вы, вероятно, move_uploaded_file
:
<?php header('Content-Type: application/json'); $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["userfile"]["name"])); if ((($_FILES["userfile"]["type"] == "image/gif") || ($_FILES["userfile"]["type"] == "image/jpeg") || ($_FILES["userfile"]["type"] == "image/png") || ($_FILES["userfile"]["type"] == "image/pjpeg")) && ($_FILES["userfile"]["size"] < 200000) && in_array($extension, $allowedExts)) { if ($_FILES["userfile"]["error"] > 0) { echo json_encode(array("error" => $_FILES["userfile"]["error"])); } else { if (file_exists("upload/" . $_FILES["userfile"]["name"])) { echo json_encode(array( "error" => $_FILES["userfile"]["name"] . " already exists")); } else { move_uploaded_file($_FILES["userfile"]["tmp_name"], "upload/" . $_FILES["userfile"]["name"]); echo json_encode(array("success" => true, "upload" => $_FILES["userfile"]["name"], "type" => $_FILES["userfile"]["type"], "size" => ($_FILES["userfile"]["size"] / 1024) . " kB", "stored in" => "upload/" . $_FILES["userfile"]["name"])); } } } else { echo json_encode(array( "error" => "Invalid file")); } ?>
Возможно, вам не нужна проверка размера файла (или 200k не может быть правильным порогом), так что это зависит от вас. Но обратите внимание, что для программных интерфейсов я отформатирую ответ в JSON, поэтому мое приложение может легко проанализировать ответ.
Загрузка файлов хранится во временной папке. Поскольку вы предоставляете только базовое имя своего файла ( basename($_FILES['userfile']['name']
), поиск файла осуществляется по текущему пути, но его нет. Укажите полный путь, и ваш скрипт будет работать ,