Я долго искал, и у меня ничего не получается.
Я даже попробовал Alamofire.
Я пытаюсь загрузить изображение в приложении для iOS (Swift 2.0) в плагин WordPress Photo-Contest через PHP. Скрипт PHP также используется для веб-сайта WordPress для загрузки изображений.
Это PHP:
<?php
define('WP_USE_THEMES', false);
require_once("../../../../../wp-load.php");
$username = $_POST["username"];
$m = contest_upload_photo('contest-upload-photo', 'contest_upload_photo',username_exists($username ));
function contest_upload_photo($atts, $content = null,$user_ID=null) {
//Important variables
if ($user_ID == null){
die();
}
$html = '';//Inciate output string
$koncovky = array('jpg', 'jpeg', 'png', 'gif');
$number_images = get_user_meta($user_ID, 'contest_user_images', true);
if(empty($number_images)){$number_images=0;}
$error = array();
// Do some minor form validation to make sure there is content
$name = trim($_POST['photo-name']);
/*if (empty($_POST['photo-title'])){
$error['title'] = __('Please enter the photo title','photo-contest');
} else {
$title = trim($_POST['photo-title']);
}*/
//Check photo
if ($_FILES['contest-photo']['error'] == UPLOAD_ERR_NO_FILE){
$error['photo'] = __('Please select the image','photo-contest');
} else {
//Control upload and extension
if ($_FILES['contest-photo']['error']) {
$error['upload_error'] = __('Error image upload.','photo-contest');
}
elseif (!in_array(strtolower(pathinfo($_FILES['contest-photo']['name'], PATHINFO_EXTENSION)), $koncovky)) {
$error['extension_error'] = __('Image must be jpg, png or gif.','photo-contest');
}
elseif (!($imagesize = getimagesize($_FILES['contest-photo']['tmp_name'])) || $imagesize[2] > 3) {
$error['type_error'] = __('Image type must be jpg, png or gif.','photo-contest');
}
else {
@$img=getimagesize($_FILES['contest-photo']['tmp_name']);
$minimum = array('width' => '400', 'height' => '400');
$width= $img[0];
$height =$img[1];
if ($width < $minimum['width'] ){
$error['type_error'] = __('Minimum image width is 400px.','photo-contest');
}
elseif ($height < $minimum['height']){
$error['type_error'] = __('Minimum image height is 400px.','photo-contest');
}
$photo_limit = get_option( 'pcplugin-photo-limit', true );
$size_maxi = $photo_limit;
$size = filesize($_FILES['contest-photo']['tmp_name']);
if($size>$size_maxi){
$error['size_error'] = __('File size is above allowed limitations!','photo-contest');
}
}
}
if(empty($error)){
//If no exist error - create attachment post
if(empty($_POST['photo-description'])){
$description = sanitize_text_field($_POST['photo-description']);
}else{
$description = '';
}
@$wp_filetype = wp_check_filetype(basename($_FILES['contest-photo']['name']), null );
@$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename( $_FILES['contest-photo']['name'] ),
'post_mime_type' => $wp_filetype['type'],
'post_title' => $name,
'post_content' => $description,
'post_status' => 'inherit'
);
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
$attach_id = media_handle_upload( 'contest-photo', 0,$attachment );
$attach_data = wp_generate_attachment_metadata( $attach_id, $wp_upload_dir['url'] . '/' . basename( $_FILES['contest-photo']['name']) );
wp_update_attachment_metadata( $attach_id, $attach_data );
update_post_meta($attach_id,'contest-active',1);
update_post_meta($attach_id,'contest-photo-points',0);
update_post_meta($attach_id,'contest-photo-author',$user_ID);
update_post_meta($attach_id,'post_author',$user_ID);
$number_images = $number_images+1;
update_user_meta($user_ID, 'contest_user_images', $number_images);
$my_post = array(
'ID' => $attach_id,
'post_author' => $user_ID,
);
wp_update_post( $my_post );
$image = get_post( $attach_id );
if ($attach_id==""){
die("306");
}else{
echo($attach_id);
}
if ( ! $image || 'attachment' != $image->post_type || 'image/' != substr( $image->post_mime_type, 0, 6 ) )
die( json_encode( array( 'error' => sprintf( __( 'Failed resize: %s is an invalid image ID.', 'regenerate-thumbnails' ), esc_html( $attach_id ) ) ) ) );
$fullsizepath = get_attached_file( $image->ID );
if ( false === $fullsizepath || ! file_exists( $fullsizepath ) )
// @set_time_limit( 900 ); // 5 minutes per image should be PLENTY
$metadata = wp_generate_attachment_metadata( $image->ID, $fullsizepath );
if ( is_wp_error( $metadata ) )
if ( empty( $metadata ) )
wp_update_attachment_metadata( $image->ID, $metadata );
return $attach_id;
}
}
?>
И это моя функция в SWIFT:
func send()
{
let imageData :NSData = UIImageJPEGRepresentation(globalImage, 1.0)!;
var request: NSMutableURLRequest?
let HTTPMethod: String = "POST"let timeoutInterval: NSTimeInterval = 60
let HTTPShouldHandleCookies: Bool = false
let postString = "username=\(globalUsr)"
request = NSMutableURLRequest(URL: NSURL(string: "***URL TO upload.php***")!)
request!.HTTPMethod = HTTPMethod
request!.timeoutInterval = timeoutInterval
request!.HTTPShouldHandleCookies = HTTPShouldHandleCookies
request!.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let boundary = "----------SwIfTeRhTtPrEqUeStBoUnDaRy"let contentType = "multipart/form-data; boundary=\(boundary)"request!.setValue(contentType, forHTTPHeaderField:"Content-Type")
let body = NSMutableData();
let tempData = NSMutableData()
let fileName = "\(globalImage.description).jpg"let parameterName = "contest-photo"
let mimeType = "application/octet-stream"
tempData.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
let fileNameContentDisposition = "photo-description=\(fileName)"let contentDisposition = "Content-Disposition: form-data; contest-photo=\"\(parameterName)\"; \(fileNameContentDisposition)\r\n"tempData.appendData(contentDisposition.dataUsingEncoding(NSUTF8StringEncoding)!)
tempData.appendData("Content-Type: \(mimeType)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
tempData.appendData(imageData)
tempData.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(tempData)
body.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
request!.setValue("\(body.length)", forHTTPHeaderField: "Content-Length")
request!.HTTPBody = body
do {
let data = try NSURLConnection.sendSynchronousRequest(request!, returningResponse: nil)
print("\(data)-Data")
} catch (let vl_error) {
print("\(vl_error)-Error")
}
}
После долгих перемоток я много испортил код, а также скопировал некоторый код от других людей, которых я нашел, просто чтобы он заработал.
Я получаю<> -Данные «распечатаны в консоли.
Буду признателен за любую помощь или подсказку.
После разговора в комментариях вам понадобился рабочий пример, чтобы опубликовать ваше имя пользователя на сервере.
Это веб-сервис Java REST:
@POST
@Produces(MediaType.TEXT_PLAIN)
@Path("/swiftCalculator")
public String swiftCalculator(@FormParam("x") int x, @FormParam("y") int y){
System.out.println("x="+x);
System.out.println("y="+y);
return (x + y) + "";
}
И вот как вы это называете со своего быстрого клиента:
func testPost(sender: UIButton) {
let session = NSURLSession.sharedSession()
let request = NSMutableURLRequest(URL: NSURL(string: "http://localhost:8080/iOSServer/ios/helloworld/swiftCalculator")!)
request.HTTPMethod = "POST"let d = "4"let data = "x=4&y=\(d)"request.HTTPBody = data.dataUsingEncoding(NSASCIIStringEncoding)
let task = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) in
if let error = error {
print(error)
}
if let data = data{
print("data =\(data)")
}
if let response = response {
print("response = \(response)")
}
})
task.resume()
}
Обратите внимание, что в сценарии ожидаются значения в post, поэтому вы передаете имя пользователя на URL, а затем попросите свой php-скрипт найти его в переменных post. Вот почему вы получили нулевой в вашем PHP-скрипте.
В этом примере я пытался сообщение две переменные, которые являются x и y от моего клиента swift к моему веб-сервису REST jersey.
Надеюсь это поможет
Я настроил функцию в swift, которая до сих пор работает нормально.
Мне нужно только знать, как загрузить файл в скрипт php, я пробовал разные подходы, но теперь он выдает ошибку, что изображение должно быть jpg, png или gif.
Имя пользователя, имя фотографии и описание принимаются сценарием.
func send() {
let request = NSMutableURLRequest(URL: NSURL(string: "***URL***")!)
request.HTTPMethod = "POST"let postString = "username=\(globalUsr)&photo-name=\(globalImage.description)&photo-description=\(message.text)"
let myData : NSData! = postString.dataUsingEncoding(NSUTF8StringEncoding)
let imageData :NSData = UIImagePNGRepresentation(globalImage, 1.0)!;
let boundary = "----------SwIfTeRhTtPrEqUeStBoUnDaRy"let contentType = "multipart/form-data; boundary=\(boundary)"let body = NSMutableData();
let tempData = NSMutableData()
let fileName = "\(globalImage.description).jpg"let parameterName = "contest-photo"
let mimeType = "application/octet-stream"
tempData.appendData(myData)
tempData.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
let fileNameContentDisposition = "name=\(fileName)"let contentDisposition = "Content-Disposition: form-data; name=\"\(fileName)\"; \(imageData)\r\n"tempData.appendData(contentDisposition.dataUsingEncoding(NSUTF8StringEncoding)!)
tempData.appendData("Content-Type: \(mimeType)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
tempData.appendData(imageData)
tempData.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
body.appendData(tempData)
body.appendData("\r\n--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
request.setValue("\(body.length)", forHTTPHeaderField: "Content-Length")
request.HTTPBody = body
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString!)")
}
task.resume()