【问题标题】:How to Upload video to server from iPhone with AFNetworking如何使用 AFNetworking 从 iPhone 上传视频到服务器
【发布时间】:2016-11-24 07:49:16
【问题描述】:

我正在使用 post 方法将视频上传到服务器。但存在服务器没有接收到的问题。

以下是我发布视频的代码。

这段代码在上传图片时对我有用,但是当视频出现失败时

我使用 UIImagePickerController 来获取视频

AVAssetExportSession 到转换器到 mp4

当我尝试上传我的视频时,服务器看到没有收到我的帖子。

但我不知道为什么?

请给我一些建议。谢谢。

NSString *boundary = @"---011000010111000001101001";
NSMutableData *body = [NSMutableData data];


NSDictionary *headers = @{ @"content-type": @"multipart/form-data; boundary=---011000010111000001101001",
                           @"cache-control": @"no-cache"};



[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"uid"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", name] dataUsingEncoding:NSUTF8StringEncoding]];



[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"title"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", title] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"note"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"%@\r\n", note] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

if (videoData) {

    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@.mp4; filename=%@.mp4\r\n", @"file", @"video1"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: multipart/form-data; boundary=---011000010111000001101001\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
   [body appendData:[@"Content-Type: video/mp4\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:videoData];
     [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

}
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

 NSError *errorFormAppend;

AFHTTPRequestSerializer *serializer = [AFJSONRequestSerializer serializer];
NSMutableURLRequest *request = [serializer multipartFormRequestWithMethod:@"POST" URLString:@"url" parameters:nil
                                                constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {



                                                    [formData appendPartWithHeaders:headers body:body];

                                                       NSError *error = errorFormAppend;

                                                    NSLog(@"errorFormAppend: %@", error);

                                                 //   [formData appendPartWithFileData:imageData name:@"file[]" fileName:@"video1.mp4" 
                                                } error:nil];

 NSString *contentType = [NSString stringWithFormat:@"multipart/form-data"];
  [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

[request setHTTPBodyStream:[NSInputStream inputStreamWithFileAtPath:[originVideoURL path]]];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:body];


[request addValue:@"video/mp4" forHTTPHeaderField:@"Content-Type"];
[request setTimeoutInterval:60.0];

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"multipart/form-data",@"text/html",nil];
[manager.requestSerializer setTimeoutInterval:60.0];

NSURLSessionUploadTask *uploadTask;
uploadTask = [manager
              uploadTaskWithStreamedRequest:request
              progress:^(NSProgress * _Nonnull uploadProgress) {


                  });
              }
              completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                  if (error) {
                      NSLog(@"Error video upload: %@", error);
                  } else {


                       if ( 200 == [responseObject[@"status_code"] integerValue] ) {

                           NSLog(@"upload Success");

                       } else {

                       }

                  }
              }];

[uploadTask resume];

【问题讨论】:

  • 这里有什么问题?
  • 服务器返回错误但可以处理图像

标签: ios iphone video


【解决方案1】:

*

Try this
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:[NSString stringWithFormat:@"%@%@",BASEURL,url] parameters:parameter constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
            if (videoData) {
                [formData appendPartWithFileData: videoData name:@"video_file" fileName:@"video_file.mp4" mimeType:@"video/mp4"];

              // you file to upload
            }
        }error:nil];

        AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        manager.responseSerializer = [AFJSONResponseSerializer serializer];

        NSURLSessionUploadTask *uploadTask;
        uploadTask = [manager
                      uploadTaskWithStreamedRequest:request
                      progress:^(NSProgress * _Nonnull uploadProgress) {
                          dispatch_async(dispatch_get_main_queue(), ^{
                          });
                      }
                      completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
                          if (error) {
                              NSLog(@"Error: %@", [[NSString alloc]initWithData:[[error valueForKey:@"userInfo"] valueForKey:@"com.alamofire.serialization.response.error.data"] encoding:NSUTF8StringEncoding]);

                          } else {
                          }
                      }];

        [uploadTask resume];

*

【讨论】:

  • 感谢您的帮助,但我没有运气。
  • 警告:implode():第 238 行 /var/www/html/topic/unit_upd_frm.php 中传递的参数无效
  • 这是您的后端错误,因此您需要从他们这边解决,
  • 服务器只是响应视频上传失败
【解决方案2】:
 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
        manager.requestSerializer = [AFJSONRequestSerializer serializer];

      AFHTTPRequestOperation *operation = [manager POST:apiType parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData){
          [formData appendPartWithFileData:fileData name:@"file" fileName:strFileName mimeType:mimeType];

        }success:^(AFHTTPRequestOperation *operation,id responseObject){

            NSLog(@"JSON: %@", responseObject);
            successHandler(operation, responseObject);
        }
              failure:^(AFHTTPRequestOperation *operation, NSError *error){
                  myProgressView.progress = 1.0;

              }];
        }];

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2015-12-22
    • 2017-02-13
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多