【问题标题】:UIImage uploading using NSMutable request使用 NSMutable 请求上传 UIImage
【发布时间】:2011-04-06 15:52:51
【问题描述】:

我需要发布一个请求。该请求有 3 个参数,“email_id”、“location”和“image_data”。 'image_data' 的值包含 UIImage 的 NSData jpeg 表示。必须使用 multipart/form-data 的内容类型提交请求。如何创建 NSMutableRequest 来发布此请求?我应该如何设置边界?整个数据包都需要边界还是仅图像部分就足够了?

【问题讨论】:

    标签: iphone post file-upload multipartform-data


    【解决方案1】:

    此链接:

    http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/

    应该包含你需要的一切。你需要扩展 PHP 脚本来处理你的非图像参数,但这是我使用的。 :)

    编辑:注意到上一个链接已损坏。新的工作

    【讨论】:

      【解决方案2】:

      如果我是你,我会查看 ASIHTTPRequest 库。它是 Cocoa 的一个 HTTP 客户端库,让那些通过 iPhone 应用程序进行大量网络交互的人的生活变得如此轻松。

      这是我,使用 ASIFormDataRequest(ASIHTTPRequest 的一个组件)从我的 iPhone 应用上传图像。客户对这些图像的称呼是“标记”——它们将出现在当地用户拍摄的本地图片地图上。邀请用户“做你的标记”。你可以想象随之而来的欢闹。

      Anyhoo,self.mark 是我的 Mark 类的一个实例,它封装了关于我正在上传的图像和详细信息包的数据。我在此方法的第一行中使用了一个数据管理器单例,其中包含当前的 CLLocation,因此我可以获取此图片的地理编码信息。

      请注意,我不关心编码类型或多部分边界。图书馆处理所有这些。

      -(void)completeUpload
      {
          CLLocation *currentLoc = [DataManager sharedDataManager].currentLocation;
          self.mark.latitude = [NSNumber numberWithDouble:currentLoc.coordinate.latitude];
          self.mark.longitude = [NSNumber numberWithDouble:currentLoc.coordinate.longitude];
      
          ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:
                                         [NSURL URLWithString:[NSString stringWithFormat:@"%@image_upload.php", WEBAPPURL]]];
      
      
          [request setPostValue:self.mark.titleText forKey:@"title"];
          [request setPostValue:self.mark.descriptionText forKey:@"description"];
          [request setPostValue:self.mark.event.guid forKey:@"event"];
          [request setPostValue:self.mark.latitude forKey:@"latitude"];
          [request setPostValue:self.mark.longitude forKey:@"longitude"];
          [request setPostValue:self.mark.project forKey:@"project"]; 
       [request setPostValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"userID"] forKey:@"user_id"];
          request.timeOutSeconds = 120;
      
          int i = 1;
          for (NSString *tag in self.tags) {
              [request setPostValue:tag forKey:[NSString stringWithFormat:@"tag-%d", i]];
               i++;
          }
      
          NSData *imageData = UIImagePNGRepresentation(self.mark.image);
          NSData *thumbData = UIImagePNGRepresentation(self.mark.thumbnail);
          [request setData:imageData forKey:@"file"];
          [request setData:thumbData forKey:@"thumb"];
      
          self.progress.progress = 20.0;
          [request setUploadProgressDelegate:self.progress];
          request.showAccurateProgress = YES;
      
          request.delegate = self;
          [request startAsynchronous];
      }
      

      编辑:顺便说一下,我发布到的 PHP 脚本在 HTTP 身份验证之后。 ASI 缓存了这些凭据,并且我之前提供了它们,因此我不必在这里再次提供它们。我注意到,因为否则,这篇文章和相应的 PHP 脚本的编写方式,任何人都可以伪造任何其他人的用户 ID 值并在他们的用户名下发布任何内容。当您构建这样的应用程序时,您必须考虑 Web 应用程序的安全性,这与它是一个网站没有什么不同。它是一个网站,实际上只是通过非传统客户端浏览的。

      【讨论】:

      • 感谢您的快速回复。但是我不能在我的项目中使用像 ASIHttpRequest 这样的第三方库。
      • 为什么?这是学校作业还是什么?真正的开发者重用代码。
      【解决方案3】:
      NSData *imageData=UIImageJPEGRepresentation(imageview.image, 1.0); NSString *filename=@"nike.jpg" NSString *urlString = @"http://xyz.com/file_upload/file1.php"; NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease]; [请求 setURL:[NSURL URLWithString:urlString]]; [请求 setHTTPMethod:@"POST"]; NSString *boundary = [NSString stringWithString:@"-----------------99882746641449"]; NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;boundary=%@",boundary]; [请求 addValue:contentType forHTTPHeaderField:@"Content-Type"]; NSMutableData *body = [NSMutableData 数据]; NSMutableString * string = [[NSMutableString alloc] init]; [字符串 appendFormat:@"\r\n\r\n--%@\r\n", 边界]; [string appendFormat:@"Content-Disposition: form-data; name=\"emailid\"\r\n\r\n"]; [字符串 appendFormat:@"pradz39@gmail.com"]; //价值 [正文 appendData:[字符串 dataUsingEncoding:NSUTF8StringEncoding]]; // 加密整个正文 [正文 appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n",filename]] dataUsingEncoding: NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; [正文 appendData:[NSData dataWithData:imageData]]; [正文 appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; [字符串释放]; [请求 setHTTPBody:body]; NSData *returnData = [NSURLConnection sendSynchronousRequest:request returnedResponse:nil error:nil]; NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

      【讨论】:

        猜你喜欢
        • 2012-06-16
        • 2012-10-27
        • 2014-11-21
        • 2016-11-15
        • 2018-08-28
        • 2011-08-30
        • 2019-03-21
        • 2018-12-16
        • 1970-01-01
        相关资源
        最近更新 更多