1

現在のプロジェクトでは、UITableViewController特定のデータを収集し、ユーザーの要求によってバックエンド サーバーに送信する を実装しました。これはすべて正常に動作します..しかし、画像のアップロードに問題があります。

から画像を取得してUIImagePickerController送信するとすぐに、サーバーに問題があるようです。JPEGとしてエンコードすると、PHPはそれを理解していないようです... PNGとしてエンコードすると、リクエスト全体が台無しになるようです。

ただし、プロジェクトに存在する他の画像 (背景画像など) を選択すると、アップロード プロセスは完全に機能します。それが奇妙な部分です。UIImagePickerController から画像を使用するとすぐに、機能しません...画像を取得しても (動作するコードの addSubview を参照)。

これは私のコードです:

@interface ServiceViewController ()

@property (nonatomic) UIImage *image;
[...]

@end

@implementation ServiceViewController

@synthesize image = _image;
[...]

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    self.image = [[info objectForKey:UIImagePickerControllerOriginalImage] copy];

    [self.tableView reloadData];

    [self dismissModalViewControllerAnimated:YES];
}

- (void)sendToApi
{
    // Send post data
    NSString *urlString = [NSString stringWithFormat:@"%@/%@", API_BASE_DOMAIN2, @"requestservice"];
    urlString = @"http://localhost/api/public_html/requestservice";

    NSURL *url = [NSURL URLWithString:urlString];

    ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url];
    [request setUseKeychainPersistence:YES];
    [request setPostValue:[self.problems objectAtIndex:self.problem] forKey:@"problem"];
    [request setPostValue:[self stationName] forKey:@"station"];
    [request setPostValue:self.otherInformation forKey:@"information"];
    [request setPostValue:[NSNumber numberWithInt:self.lock] forKey:@"lock"];
    [request setUploadProgressDelegate:self];
    [request setDidFinishSelector:@selector(didCompleteRequestService:)];
    [request setDidFailSelector:@selector(processFailed:)];
    [request setDelegate:self];
    [request setRequestMethod:@"POST"];

    // Upload an image
    [request addData:[NSData dataWithData:UIImageJPEGRepresentation(self.image, 0.9)] withFileName:@"img.jpg" andContentType:@"image/jpeg" forKey:@"picture"];


    UIImageView *view = [[UIImageView alloc] initWithImage:self.image];
    [view sizeToFit];
    [self.view addSubview:view];

    [request startAsynchronous];
}

- (void)setProgress:(float)newProgress {
//    [prgressView setProgress:newProgress];
    NSLog(@"New progress: %f", newProgress);
}

- (void)didCompleteRequestService:(ASIHTTPRequest *)request
{
    NSLog(@"Request completed");
    NSLog(@"Result: %@", request.responseString);
}

サーバ側:

    var_dump($_FILES);

    if ($this->_aPicture !== null) {
        $sTarget = DIR_SERVICE . $this->_sFileNamePrefix . ".jpg";

        var_dump($this->_aPicture);
        var_dump($sTarget);

        if (!move_uploaded_file($this->_aPicture['tmp_name'], $sTarget)) {
            $this->returnHttpError(500);
        }
    }

    $this->_writeDataToFile();

これは私の結果です:

2013-03-21 00:04:04.859 AppName[15598:c07] New progress: 0.000000
2013-03-21 00:04:04.862 AppName[15598:c07] New progress: 1.000000
2013-03-21 00:04:04.863 AppName[15598:c07] Request completed
2013-03-21 00:04:04.863 AppName[15598:c07] Result: array(1) {
  ["picture"]=>
  array(5) {
    ["name"]=>
    string(7) "img.jpg"
    ["type"]=>
    string(0) ""
    ["tmp_name"]=>
    string(0) ""
    ["error"]=>
    int(1)
    ["size"]=>
    int(0)
  }
}
array(5) {
  ["name"]=>
  string(7) "img.jpg"
  ["type"]=>
  string(0) ""
  ["tmp_name"]=>
  string(0) ""
  ["error"]=>
  int(1)
  ["size"]=>
  int(0)
}
string(58) "/Users/paulp/Sites/api/service/K98XQPo7zx.jpg"
Sending error: 500

次のようなさまざまなことを試しました。

そのための時間や予算がないため(まだ)、MKNetworkKitなどに変更していないため、解決策ではありません。

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

2

選択した画像を保存する

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo {

    //Save selected image to document directory
    jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"];
    [UIImageJPEGRepresentation(img, 1.0) writeToFile:jpgPath atomically:YES];
    [picker dismissModalViewControllerAnimated:YES];
}

次に、ASIFormDataRequestsetFile:forKeyメソッドを使用して画像をサーバーに送信します

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
if (jpgPath.length > 0) {
     [request setFile:jpgPath forKey:@"image"]; 
}
于 2013-03-21T07:09:49.850 に答える
1

最終的に、以前のコードは完全に機能しました...私のPHP設定が間違っていたことが判明しました。私のphp.iniファイルでは、構成値upload_max_filesizeはデフォルトの2M. それを変更した後、200Mそれは完全に機能しました。

于 2013-03-21T20:16:18.280 に答える
0

このコードを試してみてください、それは私にとって完璧に機能します:

[request addData:UIImagePNGRepresentation(image) withFileName:@"image.png" andContentType:@"multipart/form-data" forKey:@"image"];
于 2013-03-21T00:11:34.000 に答える