• iOS+PHP图片上传


    这篇博客用于实现iOS客户端通过POST请求,将图片上传到服务器上。服务器端语言采用PHP,服务器环境使用MAMP搭建。先使用浏览器测试图片是否可以上传,浏览器测试成功之后再测试iOS客户端是否可以成功上传图片。

    服务端代码:

    upload_file.php

    <?php
    
    if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/pjpeg"))
    && ($_FILES["file"]["size"] < 20000000))
      {
      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
          {
          move_uploaded_file($_FILES["file"]["tmp_name"],
          "upload/" . $_FILES["file"]["name"]);
          echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
          }
        }
      }
    else
      {
      echo "Invalid file";
      }
    ?>

    浏览器测试代码:

    upload.html

    <html>
    <body>
    
    <form action="upload_file.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>
    </html>

    MAMP服务器的目录结构如下:(新建一个upload文件夹用于存放图片,将upload文件夹和upload.html、upload_file.php放在同一个目录下)

    iOS客户端代码:

    ViewController.m

    #import "ViewController.h"
    
    static NSString *boundry = @"----------V2ymHFg03ehbqgZCaKO6jy";//设置边界
    
    @interface ViewController ()<UINavigationControllerDelegate, UIImagePickerControllerDelegate,NSURLSessionTaskDelegate>
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    #pragma mark-打开相册
    - (IBAction)openAlbumClicked:(UIButton *)sender {
        
        UIImagePickerController *picController = [[UIImagePickerController alloc] init];
        
        picController.delegate = self;
        
        [self presentViewController:picController animated:YES
                         completion:nil];
        
        
    }
    
    #pragma mark-代理方法
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
        
        NSLog(@"选择图片:
    %@",info);
        
        [self uploadDataWithImage:info[@"UIImagePickerControllerOriginalImage"]];
        
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    
    /**
     上传图片
     */
    - (void)uploadDataWithImage:(UIImage *)img{
        
        NSURL *url = [NSURL URLWithString:@"http://10.51.3.160:8888/upload_file.php"];
        NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
        
        //设置Method
        urlRequest.HTTPMethod = @"POST";
        
        //4.设置请求头
        //在请求头中添加content-type字段
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; charset=utf-8;boundary=%@",boundry];
        [urlRequest setValue:contentType forHTTPHeaderField:@"Content-Type"];
        
        NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
        
        //NSURLSession
        NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[[NSOperationQueue alloc]init]];
        
        //定义上传操作
        NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:urlRequest fromData:[self getBodydataWithImage:img] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            NSLog(@"响应结果:%@", response);
            NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"返回数据:
    %@",str);
        }];
        
        [uploadTask resume];
    }
    
    - (NSData *)getBodydataWithImage:(UIImage *)image
    {
        //把文件转换为NSData
        NSData *fileData = UIImageJPEGRepresentation(image, 0.8);
        
        //文件名
        NSString *fileName=@"test";
        
        //1.构造body string
        NSMutableString *bodyString = [[NSMutableString alloc] init];
        
        //2.拼接body string
        //(1)file_name
        [bodyString appendFormat:@"--%@
    ",boundry];
        [bodyString appendFormat:@"Content-Disposition: form-data; name="FileName"
    "];
        [bodyString appendFormat:@"Content-Type: text/plain; charset="utf-8"
    
    "];
        [bodyString appendFormat:@"aaa%@.jpg
    ",fileName];
        
        //(2)PostID
    //    [bodyString appendFormat:@"--%@
    ",boundry];
    //    [bodyString appendFormat:@"Content-Disposition: form-data; name="PostID"
    "];
    //    [bodyString appendFormat:@"Content-Type: text/plain; charset="utf-8"
    
    "];
    //    [bodyString appendFormat:@"%@
    ",self.uuID];
        
        //(3)pic
        [bodyString appendFormat:@"--%@
    ",boundry];
        [bodyString appendFormat:@"Content-Disposition: form-data; name="file"; filename="%@.jpg"
    ",fileName];
        [bodyString appendFormat:@"Content-Type: image/jpeg
    
    "];
        //[bodyString appendFormat:@"Content-Type: application/octet-stream
    
    "];
        
        //3.string --> data
        NSMutableData *bodyData = [NSMutableData data];
        //拼接的过程
        //前面的bodyString, 其他参数
        [bodyData appendData:[bodyString dataUsingEncoding:NSUTF8StringEncoding]];
        //图片数据
        [bodyData appendData:fileData];
        
        //4.结束的分隔线
        NSString *endStr = [NSString stringWithFormat:@"
    --%@--
    ",boundry];
        //拼接到bodyData最后面
        [bodyData appendData:[endStr dataUsingEncoding:NSUTF8StringEncoding]];
        
        return bodyData;
    }
    
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend{
        
        CGFloat progress = totalBytesSent * 1.0 / totalBytesExpectedToSend;
        NSLog(@"上传进度:%f%%",progress*100);
        
    }
    
    /*
     上传成功
     */
    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
        NSLog(@"上传成功! Error:%@",error);
    }
    
    @end

    iOS客户端Demo

  • 相关阅读:
    Python教程:从零到大师
    Hive 安装 & Mysql 安装
    Hive基本原理及配置Mysql作为Hive的默认数据库
    分布式存储系统-HDFS
    centos 6.4-linux环境配置,安装hadoop-1.1.2(hadoop伪分布环境配置)
    VirtualBox安装Centos出现E_FAIL (0x80004005)的解决方法
    Hadoop 中HDFS、MapReduce体系结构
    探索性测试及基本用例
    软件测试相关术语(测试策略 && 测试方案 ....)
    高效学习的疑问与思路[软技能]
  • 原文地址:https://www.cnblogs.com/wobuyayi/p/7826714.html
Copyright © 2020-2023  润新知