五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > iOS上傳圖像到服務(wù)器PHP接收的方法

iOS上傳圖像到服務(wù)器PHP接收的方法

文章來(lái)源:365jz.com     點(diǎn)擊數(shù):555    更新時(shí)間:2018-06-02 00:40   參與評(píng)論
1. 將圖片轉(zhuǎn)換為Base64編碼,POST上傳。PHP將Base64解碼為二進(jìn)制,再寫出文件。缺點(diǎn):不能上傳較大的圖片

// iOS(Swift)
func upload(image: UIImage, url: String) {
    let imageData = UIImageJPEGRepresentation(image, 0.3) // 將圖片轉(zhuǎn)換成jpeg格式的NSData,壓縮到0.3
    let imageStr = imageData?.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) // 將圖片轉(zhuǎn)換為base64字符串
    let params: NSDictionary = ["file": imageStr!]
    let manager = AFHTTPRequestOperationManager()

    // 采用POST的方式上傳,因?yàn)镻OST對(duì)長(zhǎng)度沒有限制
    manager.POST(url, parameters: params, success: { (_: AFHTTPRequestOperation!, response: AnyObject!) in
        // 成功
    }) { (_: AFHTTPRequestOperation!, _: NSError!) in
        // 失敗
    }
}

<?php
header('Content-type: text/json; charset=UTF-8');

$base64 = $_POST["file"]; // 得到參數(shù)
$img = base64_decode($base64); // 將格式為base64的字符串解碼
$path = "md5(uniqid(rand()))".".jpg"; // 產(chǎn)生隨機(jī)唯一的名字作為文件名
file_put_contents($path, $img); // 將圖片保存到相應(yīng)位置
?>


2.AFNetworking上傳,PHP端通過正常接收網(wǎng)頁(yè)上傳方法來(lái)接收?qǐng)D片

static func uploadPortrait(image: UIImage, url: String) {
    let manager = AFHTTPRequestOperationManager()

    // fromData: AFN封裝好的http header類,可以添加請(qǐng)求體
    manager.POST(url, parameters: [:], constructingBodyWithBlock: { (fromData: AFMultipartFormData!) in
        let pngData = UIImagePNGRepresentation(image)
        // name必須和后臺(tái)PHP接收的參數(shù)名相同($_FILES["file"])
        // fileName為圖片名
        fromData.appendPartWithFileData(pngData, name: "file", fileName: "image.png", mimeType: "image/png")     

        // let jpegData = UIImageJPEGRepresentation(image, 0.3)
        // fromData.appendPartWithFileData(jpegData, name: "file", fileName: "image.jpg", mimeType: "image/jpeg")
    }, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) in
        // 成功
    }) { (operation: AFHTTPRequestOperation!, error: NSError!) in
        // 失敗
    }  
}

<?php
header('Content-type: text/json; charset=UTF-8' );

/**
* $_FILES 文件上傳變量,是一個(gè)二維數(shù)組,第一維保存上傳的文件的數(shù)組,第二維保存文件的屬性,包括類型、大小等
* 要實(shí)現(xiàn)上傳文件,必須修改權(quán)限為加入可寫 chmod -R 777 目標(biāo)目錄
*/

// 文件類型限制
// "file"名字必須和iOS客戶端上傳的name一致
if (($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
// && ($_FILES["file"]["size"] < 20000)) // 小于20k
{
    if ($_FILES["file"]["error"] > 0) {
        echo $_FILES["file"]["error"]; // 錯(cuò)誤代碼
    } else {          
        $fillname = $_FILES['file']['name']; // 得到文件全名
        $dotArray = explode('.', $fillname); // 以.分割字符串,得到數(shù)組
        $type = end($dotArray); // 得到最后一個(gè)元素:文件后綴

        $path = "../portrait/".md5(uniqid(rand())).'.'.$type; // 產(chǎn)生隨機(jī)唯一的名字

        move_uploaded_file( // 從臨時(shí)目錄復(fù)制到目標(biāo)目錄
          $_FILES["file"]["tmp_name"], // 存儲(chǔ)在服務(wù)器的文件的臨時(shí)副本的名稱
          $path);

        echo "成功";
    }
} else {
    echo "文件類型不正確";
}
?>


3.將圖片封裝在Http的請(qǐng)求報(bào)文中的請(qǐng)求體(body)中上傳。也是AFN上傳的原理

// 使用OC封裝
#import <UIKit/UIKit.h>
@interface RequestPostUploadHelper : NSObject
+ (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params;
@end

#import "RequestPostUploadHelper.h"
@implementation RequestPostUploadHelper
+ (NSMutableURLRequest *)uploadImage:(NSString*)url uploadImage:(UIImage *)uploadImage params:(NSMutableDictionary *)params {
    [params setObject:uploadImage forKey:@"file"];

    //分界線的標(biāo)識(shí)符
    NSString *TWITTERFON_FORM_BOUNDARY = @"AaB03x";
    //根據(jù)url初始化request
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                       timeoutInterval:10];
    //分界線 --AaB03x
    NSString *MPboundary=[[NSString alloc]initWithFormat:@"--%@",TWITTERFON_FORM_BOUNDARY];
    //結(jié)束符 AaB03x--
    NSString *endMPboundary=[[NSString alloc]initWithFormat:@"%@--",MPboundary];
    //要上傳的圖片
    UIImage *image=[params objectForKey:@"file"];
    //得到圖片的data
    NSData* data = UIImagePNGRepresentation(image);
    //http body的字符串
    NSMutableString *body=[[NSMutableString alloc]init];
    //參數(shù)的集合的所有key的集合
    NSArray *keys= [params allKeys];

    //遍歷keys
    for(int i = 0; i < [keys count]; i++)
    {
        //得到當(dāng)前key
        NSString *key = [keys objectAtIndex:i];
        //如果key不是file,說明value是字符類型,比如name:Boris
        if(![key isEqualToString:@"file"])
        {
            //添加分界線,換行
            [body appendFormat:@"%@\r\n",MPboundary];
            //添加字段名稱,換2行
            [body appendFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",key];
            //添加字段的值
            [body appendFormat:@"%@\r\n",[params objectForKey:key]];
        }
    }

    ////添加分界線,換行
    [body appendFormat:@"%@\r\n",MPboundary];
    //聲明file字段,文件名為image.png
    [body appendFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"image.png\"\r\n"];
    //聲明上傳文件的格式
    [body appendFormat:@"Content-Type: image/png\r\n\r\n"];

    //聲明結(jié)束符:--AaB03x--
    NSString *end=[[NSString alloc] initWithFormat:@"\r\n%@",endMPboundary];
    //聲明myRequestData,用來(lái)放入http body
    NSMutableData *myRequestData = [NSMutableData data];
    //將body字符串轉(zhuǎn)化為UTF8格式的二進(jìn)制
    [myRequestData appendData:[body dataUsingEncoding:NSUTF8StringEncoding]];
    //將image的data加入
    [myRequestData appendData:data];
    //加入結(jié)束符--AaB03x--
    [myRequestData appendData:[end dataUsingEncoding:NSUTF8StringEncoding]];

    //設(shè)置HTTPHeader中Content-Type的值
    NSString *content=[[NSString alloc]initWithFormat:@"multipart/form-data; boundary=%@",TWITTERFON_FORM_BOUNDARY];
    //設(shè)置HTTPHeader
    [request setValue:content forHTTPHeaderField:@"Content-Type"];
    //設(shè)置Content-Length
    [request setValue:[NSString stringWithFormat:@"%d", [myRequestData length]] forHTTPHeaderField:@"Content-Length"];
    //設(shè)置http body
    [request setHTTPBody:myRequestData];
    //http method
    [request setHTTPMethod:@"POST"];

    return request;
}
@end
// 使用
// Swift
static func uploadPortrait(image: UIImage, url:String) {
    // 使用
    let request = RequestPostUploadHelper.uploadImage(url, uploadImage: image, params: [:])
    // 異步網(wǎng)絡(luò)請(qǐng)求
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in
        if error != nil {
            // 失敗
        } else {
            // 成功
        }
    }
}

<?php
// PHP代碼和上一步相同
?>


4.iOS圖片轉(zhuǎn)換為NSData,通過POST上傳。PHP接收POST參數(shù),將NSData的16進(jìn)制編碼轉(zhuǎn)換為PHP支持的二進(jìn)制,再寫出文件保存
暫時(shí)沒有找到辦法,PHP接收到16進(jìn)制編碼后, 使用算法 轉(zhuǎn)換為二進(jìn)制后無(wú)法輸出圖片

5.二進(jìn)制POST上傳。PHP直接將數(shù)據(jù)保存為圖片
暫時(shí)沒有找到辦法,iOS端使用NSData的getBytes無(wú)法轉(zhuǎn)換為二進(jìn)制

iOS Post上傳圖片, 文件流的形式

最近看到群里很多小伙伴有問上傳圖片服務(wù)器收不到, 解析不了.  可以說就一個(gè)屬性  ContentType , 不論你使用第三方的AFN, 還是自己封裝NSURLSesstion. 都需要把ContentType 設(shè)置和后臺(tái)的解析方式一樣(可能術(shù)語(yǔ)不是很標(biāo)準(zhǔn), 總之就這個(gè)意思哈,諒解)


下面貼一段AFN的上傳圖片代碼吧, 親測(cè)有效, 不過可能只是針對(duì)我的服務(wù)器.  只要和后臺(tái)同學(xué)溝通好就行了

  //此body是向后臺(tái)傳的參數(shù), 因?yàn)槭巧蟼鲌D片, 所以只給個(gè)圖片名就夠了, 這個(gè)和后臺(tái)去問

    NSDictionary * body = @{@"category":@"user",@"file":@"HeadImg"};

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    //ContentType設(shè)置

    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",

                                                        

                                                         @"text/html",

                                                        

                                                         @"image/jpeg",

                                                        

                                                         @"image/png",

                                                        

                                                         @"application/octet-stream",

                                                        

                                                         @"text/json",

                                                        

                                                         nil];

   

    manager.requestSerializer= [AFHTTPRequestSerializer serializer];

   

    manager.responseSerializer= [AFHTTPResponseSerializer serializer];

   

    [manager POST:url parameters:body constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {

//把image  轉(zhuǎn)為data , POST上傳只能傳data

        NSData *data = UIImagePNGRepresentation(image);

        //上傳的參數(shù)(上傳圖片,以文件流的格式)

        [formData appendPartWithFileData:data

  

                                    name:@"file"

        

                                fileName:@"gauge.png"

        

                                mimeType:@"image/png"];

       

    } progress:^(NSProgress * _Nonnull uploadProgress) {



    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

  //請(qǐng)求成功的block回調(diào)

        NSDictionary * dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];

        NSLog(@"上傳成功%@",dic);

            

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

          NSLog(@"上傳失敗%@",error);

    }];


PHP post 接口上傳圖片 [接收ios ||androip 兩種接收?qǐng)D片數(shù)據(jù)流保存圖片方式

// 保存會(huì)員頭像
            if ($apiType != 'ios') {              

                $path = 'memberhead'; // 會(huì)員頭像
                $postName = 'avatar';
                $data = array ();
                $model_MembersPhoto = array ();
                $date = date ( "Ym" );
                $webroot = YiiBase::getPathOfAlias ( 'webroot' ); // 返回程序入口文件所在目錄
                $dirname = "/uploads/" . $path . "/" . $date . "/"; // 圖片所在文件
                if (! $this->mkdirs ( $webroot . $dirname ))         // 創(chuàng)建圖片所在目錄
                {
                    $data ['status'] = "0"; // 創(chuàng)建圖片保存目錄失敗
                } else {
                    $filepath = substr ( md5 ( md5 ( $_GET ["type"] . "_" . $memid . uniqid ( mt_rand (), true ) ) ), 2, 16 ); // 生成唯一值
                    $pic_file = CUploadedFile::getInstanceByName ( $postName );
                    if ($pic_file->size < 3 * 1024 * 1024 && $pic_file->size > 3 || 1==1) {
                        $ext = strtolower ( $pic_file->extensionName );
                        $newName = $filepath . '.' . $ext; // 生成文件名
                        if (in_array ( $ext, array ('jpg','gif','jpeg','png') )) {
                            if ($pic_file->saveAs ( $webroot . $dirname . $newName )) {
                                $data ['pstatus'] = '1'; // 圖片文件保存成功                              
                                $modelMember ["Members"] ["avatar"] = $dirname . $newName;
                            } else {
                                $data ['pstatus'] = '2'; // 圖片文件保存失敗
                                $data ['name'] = 'error';
                            }
                        } else {
                            $data ['pstatus'] = '3'; // 圖片文格式不對(duì)
                            $data ['ext'] = $ext;
                        }
                    } else {
                        $data ['pstatus'] = '4'; // 提示:文件大小不能超過3M 大于 3b
                        $data ['file'] = $pic_file;
                    }
                }
              
            } else {//IOS上傳圖片
                $date = date ( "Ym" );
                $webroot = YiiBase::getPathOfAlias ( 'webroot' ); // 返回程序入口文件所在目錄
                $dirname = "/uploads/memberhead/" . $date . "/"; // 圖片所在文件
                if (! $this->mkdirs ( $webroot . $dirname ))                 // 創(chuàng)建圖片所在目錄
                {
                    $data ['pstatus'] = "6"; // 創(chuàng)建圖片保存目錄失敗
                }
                $filepath = substr ( md5 ( md5 ( $_GET ["type"] . "_" . $memid . uniqid ( mt_rand (), true ) ) ), 2, 16 );
                $newName = $filepath . '.png';
          
                $pic = base64_decode ( $_POST ['pic_2'] );  
                file_put_contents($webroot . $dirname . $newName, $pic);
                //file_put_contents($webroot . $dirname . $filepath . '.txt', $pic);
                $data ['pstatus'] = '1';
                $modelMember ["Members"] ["avatar"] = $dirname . $newName;              
              
            }     

如對(duì)本文有疑問,請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答??! 點(diǎn)擊進(jìn)入論壇

發(fā)表評(píng)論 (555人查看,0條評(píng)論)
請(qǐng)自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動(dòng)的言論。
昵稱:
最新評(píng)論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號(hào)