Heim  >  Artikel  >  Backend-Entwicklung  >  objective-c - Thinkphp+IOS上传图片该怎么处理接收和数据

objective-c - Thinkphp+IOS上传图片该怎么处理接收和数据

WBOY
WBOYOriginal
2016-08-04 09:21:091338Durchsuche

刚开始接触APP端程序处理。
现在问题就卡在TP端接收IOS传过来的图片,请问TP端处理上传的图片数据该是怎样流程?要注意些什么问题,如数据格式应该是什么?
请问下面的处理方式正确吗?

ios文件如下:
XLSelectView.h文件:

<code>//  XLSelectView.h
//  XLUploadImages
//  Created by 薛林 on 16/6/18.
//  Copyright © 2016年 xuelin. All rights reserved.

#import <uikit>
@class ZLPhotoPickerViewController;
@interface XLSelectView : UIView
//跳转界面的block
@property (nonatomic, copy) void(^presentVC)(ZLPhotoPickerViewController *pickerVC);
//网络需要传入的参数
@property (nonatomic, copy) NSString *postUrlString;
//parameters
@property (nonatomic, strong) NSDictionary *parameters;
//后台接收图片的字段
@property (nonatomic, copy) NSString *userfile;

//加载xib
+ (instancetype)loadnib;

@end
</uikit></code>

XLSelectView.m文件:

<code>//  XLSelectView.m
//  XLUploadImages
//
//  Created by 薛林 on 16/6/18.
//  Copyright © 2016年 xuelin. All rights reserved.
//

#import "XLSelectView.h"
#import "ZLPhoto.h"
#import "AFNetworking.h"
#import "DGGlobel.h"
#import "DGSecret.h"

@interface XLSelectView ()

//保存图片二进制数据
@property (nonatomic, strong) NSMutableDictionary *fileDict;

@end


@implementation XLSelectView
#pragma mark - 懒加载字典
- (NSMutableDictionary *)fileDict {
    
    if (_fileDict == nil) {
        _fileDict = [NSMutableDictionary dictionary];
    }
    return _fileDict;
}
#pragma mark - 加载xib
+ (instancetype)loadnib {
    return [[[NSBundle mainBundle]loadNibNamed:@"XLSelectView" owner:nil options:nil]lastObject];
}


- (IBAction)selectMorePic:(id)sender {
    // 创建图片多选控制器
    ZLPhotoPickerViewController *pickerVc = [[ZLPhotoPickerViewController alloc] init];
    // 默认显示相册里面的内容SavePhotos
    pickerVc.status = PickerViewShowStatusSavePhotos;
    // 选择图片的最小数,默认是9张图片最大也是9张
    pickerVc.maxCount = 9;
    self.presentVC(pickerVc);
    
    // 用block来回调
    __weak typeof(self) weakSelf = self;
    pickerVc.callBack = ^(NSArray *assets){
        //遍历获取每一张图片 并转成二进制
        
        for (ZLPhotoAssets *asset in assets) {
            NSData *imageData = UIImagePNGRepresentation(asset.originImage);
    
            //给图片起随机名字
            NSString *filename = [NSString stringWithFormat:@"%d.png",arc4random_uniform(100)];
            
            //保存到fileDict中
            [weakSelf.fileDict setObject:imageData forKey:filename];
            
        }
        
    };

}

- (IBAction)oploadPicture:(id)sender {

    [self original];
}

- (void)original
{
    //创建管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    
    NSString *url = @"http://www.baidu.cn/index.php/Home/Index/ugc_tipic";
    [manager.requestSerializer setValue:@"application/json, image/png" forHTTPHeaderField:@"Accept"];
//    [manager.requestSerializer setValue:url.absoluteString forHTTPHeaderField:@"Referer"];

    

//    加密
        NSString *mdSecret = [DGSecret md5:[DGGlobel getInstance].secret];
    
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic setValue:[DGGlobel getInstance].user_id forKey:@"user_id"];

    
    [manager POST:url parameters:dic constructingBodyWithBlock:^(id<afmultipartformdata>  _Nonnull formData) {
        [self.fileDict enumerateKeysAndObjectsUsingBlock:^(NSString *saveFliename, NSData *fileData, BOOL * _Nonnull stop) {
            //获取到每个文件的二进制数据 拼接文本参数
            [formData appendPartWithFileData:fileData name:@"file" fileName:saveFliename mimeType:@"image/jpg"];
            
        }];
        
    } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSDictionary *content = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"上传成功content = %@",content);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"上传失败%@",[error localizedDescription]);
    }];
}

@end
</afmultipartformdata></code>

Thinkphp处理文件:

<code>$ugc_topic = M('ugc_topic');                        

$ugc_image_type = M('ugc_image_type');              

$tmp_str = '';
$upload = $_POST;
foreach($upload as $value => $key) {
    $tmp_str.= '-----'.$key.'=>'.$value."\n\r";
}

// ----------------调试程序----------------------
$filename = dirname(__FILE__).'/file.txt';

$now_time = date('Y-m-d H:i:s' , time());
$word2 = "{$now_time}\n\r{$tmp_str}\n\r\n\r";
$fh = fopen($filename, "a+");
echo fwrite($fh, $word2);
fclose($fh);

$user_id = I('post.user_id','','htmlspecialchars');             // 当前登陆成功的用户id
$title = I('post.title','','htmlspecialchars');                 // 当前发布话题的标题
$content = I('post.content','','htmlspecialchars');             // 当前发布话题的内容
$remind_who = I('post.remind_who','','htmlspecialchars');         // 提醒谁看的用户id
$image_name = I('post.image_name','','htmlspecialchars');     // 当前发布话题的图片

header("Content-Type: application/octet-stream");
$byte = $_POST['image_name'];

$byte = str_replace(' ','',$byte);   //处理数据 
$byte = str_ireplace("",'',$byte);
$byte = pack("H*",$byte);      //16进制转换成二进制

$filename2 = dirname(__FILE__).'/file.txt';

$word22 = "\n\r\n\r{$byte}\n\r\n\r";
$fhf = fopen($filename2, "a+");
echo fwrite($fhf, $word22);
fclose($fhf);
header('Content-type: text/json; charset=UTF-8');
$base64 = $_POST["file"];                 // 得到参数
$img = base64_decode($base64);             // 将格式为base64的字符串解码
$path = "md5(uniqid(rand()))".".jpg";     // 产生随机唯一的名字作为文件名
file_put_contents($path, $img);         // 将图片保存到相应位置
header('Content-type: text/json; charset=UTF-8' );</code>

请赐教~多谢!

回复内容:

刚开始接触APP端程序处理。
现在问题就卡在TP端接收IOS传过来的图片,请问TP端处理上传的图片数据该是怎样流程?要注意些什么问题,如数据格式应该是什么?
请问下面的处理方式正确吗?

ios文件如下:
XLSelectView.h文件:

<code>//  XLSelectView.h
//  XLUploadImages
//  Created by 薛林 on 16/6/18.
//  Copyright © 2016年 xuelin. All rights reserved.

#import <uikit>
@class ZLPhotoPickerViewController;
@interface XLSelectView : UIView
//跳转界面的block
@property (nonatomic, copy) void(^presentVC)(ZLPhotoPickerViewController *pickerVC);
//网络需要传入的参数
@property (nonatomic, copy) NSString *postUrlString;
//parameters
@property (nonatomic, strong) NSDictionary *parameters;
//后台接收图片的字段
@property (nonatomic, copy) NSString *userfile;

//加载xib
+ (instancetype)loadnib;

@end
</uikit></code>

XLSelectView.m文件:

<code>//  XLSelectView.m
//  XLUploadImages
//
//  Created by 薛林 on 16/6/18.
//  Copyright © 2016年 xuelin. All rights reserved.
//

#import "XLSelectView.h"
#import "ZLPhoto.h"
#import "AFNetworking.h"
#import "DGGlobel.h"
#import "DGSecret.h"

@interface XLSelectView ()

//保存图片二进制数据
@property (nonatomic, strong) NSMutableDictionary *fileDict;

@end


@implementation XLSelectView
#pragma mark - 懒加载字典
- (NSMutableDictionary *)fileDict {
    
    if (_fileDict == nil) {
        _fileDict = [NSMutableDictionary dictionary];
    }
    return _fileDict;
}
#pragma mark - 加载xib
+ (instancetype)loadnib {
    return [[[NSBundle mainBundle]loadNibNamed:@"XLSelectView" owner:nil options:nil]lastObject];
}


- (IBAction)selectMorePic:(id)sender {
    // 创建图片多选控制器
    ZLPhotoPickerViewController *pickerVc = [[ZLPhotoPickerViewController alloc] init];
    // 默认显示相册里面的内容SavePhotos
    pickerVc.status = PickerViewShowStatusSavePhotos;
    // 选择图片的最小数,默认是9张图片最大也是9张
    pickerVc.maxCount = 9;
    self.presentVC(pickerVc);
    
    // 用block来回调
    __weak typeof(self) weakSelf = self;
    pickerVc.callBack = ^(NSArray *assets){
        //遍历获取每一张图片 并转成二进制
        
        for (ZLPhotoAssets *asset in assets) {
            NSData *imageData = UIImagePNGRepresentation(asset.originImage);
    
            //给图片起随机名字
            NSString *filename = [NSString stringWithFormat:@"%d.png",arc4random_uniform(100)];
            
            //保存到fileDict中
            [weakSelf.fileDict setObject:imageData forKey:filename];
            
        }
        
    };

}

- (IBAction)oploadPicture:(id)sender {

    [self original];
}

- (void)original
{
    //创建管理者
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
    
    NSString *url = @"http://www.baidu.cn/index.php/Home/Index/ugc_tipic";
    [manager.requestSerializer setValue:@"application/json, image/png" forHTTPHeaderField:@"Accept"];
//    [manager.requestSerializer setValue:url.absoluteString forHTTPHeaderField:@"Referer"];

    

//    加密
        NSString *mdSecret = [DGSecret md5:[DGGlobel getInstance].secret];
    
        NSMutableDictionary *dic = [NSMutableDictionary dictionary];
        [dic setValue:[DGGlobel getInstance].user_id forKey:@"user_id"];

    
    [manager POST:url parameters:dic constructingBodyWithBlock:^(id<afmultipartformdata>  _Nonnull formData) {
        [self.fileDict enumerateKeysAndObjectsUsingBlock:^(NSString *saveFliename, NSData *fileData, BOOL * _Nonnull stop) {
            //获取到每个文件的二进制数据 拼接文本参数
            [formData appendPartWithFileData:fileData name:@"file" fileName:saveFliename mimeType:@"image/jpg"];
            
        }];
        
    } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSDictionary *content = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"上传成功content = %@",content);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"上传失败%@",[error localizedDescription]);
    }];
}

@end
</afmultipartformdata></code>

Thinkphp处理文件:

<code>$ugc_topic = M('ugc_topic');                        

$ugc_image_type = M('ugc_image_type');              

$tmp_str = '';
$upload = $_POST;
foreach($upload as $value => $key) {
    $tmp_str.= '-----'.$key.'=>'.$value."\n\r";
}

// ----------------调试程序----------------------
$filename = dirname(__FILE__).'/file.txt';

$now_time = date('Y-m-d H:i:s' , time());
$word2 = "{$now_time}\n\r{$tmp_str}\n\r\n\r";
$fh = fopen($filename, "a+");
echo fwrite($fh, $word2);
fclose($fh);

$user_id = I('post.user_id','','htmlspecialchars');             // 当前登陆成功的用户id
$title = I('post.title','','htmlspecialchars');                 // 当前发布话题的标题
$content = I('post.content','','htmlspecialchars');             // 当前发布话题的内容
$remind_who = I('post.remind_who','','htmlspecialchars');         // 提醒谁看的用户id
$image_name = I('post.image_name','','htmlspecialchars');     // 当前发布话题的图片

header("Content-Type: application/octet-stream");
$byte = $_POST['image_name'];

$byte = str_replace(' ','',$byte);   //处理数据 
$byte = str_ireplace("",'',$byte);
$byte = pack("H*",$byte);      //16进制转换成二进制

$filename2 = dirname(__FILE__).'/file.txt';

$word22 = "\n\r\n\r{$byte}\n\r\n\r";
$fhf = fopen($filename2, "a+");
echo fwrite($fhf, $word22);
fclose($fhf);
header('Content-type: text/json; charset=UTF-8');
$base64 = $_POST["file"];                 // 得到参数
$img = base64_decode($base64);             // 将格式为base64的字符串解码
$path = "md5(uniqid(rand()))".".jpg";     // 产生随机唯一的名字作为文件名
file_put_contents($path, $img);         // 将图片保存到相应位置
header('Content-type: text/json; charset=UTF-8' );</code>

请赐教~多谢!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn