0

今朝ずっと、iPhone で撮影した写真をブロブストアにアップロードする方法の明確な例を探していましたが、成功しませんでした。

現在、サーバーに次のコードを使用して、PHP でサーバーに写真を送信できる iPhone アプリを開発しています。

// Function to upload a photo in a file and save data in the DB
function upload($photoData, $descr, $phone) {
    // Folder to upload data
    $path = $_SERVER['DOCUMENT_ROOT']."/program/data/";

    // Check if there was no error during the file upload
    if ($photoData['error'] == 0) {
        $result = query("INSERT INTO pics(descr, phone) VALUES('%s','%s')", $descr, $phone);
        if (!$result['error']) {
            // Inserted in the database, go on with file storage
            // Obtain database link (in lib.php)
            global $link;

            // Get the last automatically generated ID
            $idPhoto = mysqli_insert_id($link);

            // Move the temporarily stored file to a convenient location
            if (move_uploaded_file($photoData['tmp_name'], $path.$idPhoto.".jpg")) {
                // File moved, all good, generate thumbnail
                thumb($path.$idPhoto.".jpg", 180);
                print json_encode(array('successful' => 1));
            } else {
                errorJson('Upload on server problem');
            }
        } else {
            errorJson('Save database problem: '.$result['error']);
        }
    } else {
        errorJson('Upload malfunction.');
    }
}

これを機能させるObjective-Cの部分は次のとおりです(私はAFNetworkingを使用しており、オブジェクトAPIのsharedInstanceはAFJSONRequestOperationクラスです):

// Upload the image and the description to the web service
[[API sharedInstance] commandWithParams:[NSMutableDictionary dictionaryWithObjectsAndKeys:
                                             @"upload", @"command",
                                             UIImageJPEGRepresentation(originalPhoto, 70), @"file",
                                             description, @"descr",
                                             phoneNumber, @"phone",
                                             nil]
                               onCompletion:^(NSDictionary *json) {
                                   // Finished and response from server
                                   if (![json objectForKey:@"error"]) {
                                       // Success
                                       [[[UIAlertView alloc]initWithTitle:@"Info"
                                                                  message:@"Thanks"
                                                                 delegate:nil
                                                        cancelButtonTitle:@"Dismiss"
                                                        otherButtonTitles: nil] show];

                                       // Send a notification so the main view can reload the data
                                       [[NSNotificationCenter defaultCenter] postNotificationName:@"updateStream" object:nil];
                                   } else {
                                       // Error
                                       NSString* errorMsg = [json objectForKey:@"error"];
                                       [UIAlertView error:errorMsg];
                                   }
                               }];

これは正常に機能し、画像はサーバーに保存されます。しかし、ファイルを保存できないデータストアでも同じようにしたいのです。そこで、画像保存の練習用にウェブページを作ってみたところ、標準のウェブフォームからブロブストアに問題なく画像をアップロードできました。これは、GAE に保存するために使用しているコードです (PicturePageHandler や render_page などの独自のヘルパー クラスや関数については忘れてください)。

# Get and post for the create page
class Create(PicturePageHandler, blobstore_handlers.BlobstoreUploadHandler):
    def get(self):
        if self.user_logged_in():
            # The session for upload a file must be new every reload page
            uploadUrl = blobstore.create_upload_url('/addPic')
            self.render_page("addPicture.htm", form_action=uploadUrl)

    def post(self):
        if self.user_logged_in():
            # Create a dictionary with the values, we will need in case of error
            templateValues = self.template_from_request()
            # Test if all data form is valid
            testErrors = check_fields(self)

            if testErrors[0]:
                # No errors, save the object
                try:
                    # Get the file and upload it
                    uploadFiles = self.get_uploads('picture')
                    # Get the key returned from blobstore, for the first element
                    blobInfo = uploadFiles[0]
                    # Add the key and the permanent url to the template
                    templateValues['blobKey'] = blobInfo.key()
                    templateValues['servingUrl'] = images.get_serving_url(blobInfo.key(), size=None)

                    # Save all
                    pic = Picture.save(self.user.key, **templateValues)
                    if pic is None:
                        logging.error('Picture save error.')

                    self.redirect("/myPics")

                except:
                    self.render_page("customMessage.htm", custom_msg=_("Problems while uploading the picture."))
            else:
                # Errors, render the page again, with the values, and showing the errors
                templateValues = custom.prepare_errors(templateValues, testErrors[1])
                # The session for upload a file must be new every reload page
                templateValues['form_action'] = blobstore.create_upload_url('/addPic')

                self.render_page("addPicture.htm", **templateValues)

私の質問は次のとおりです。

  1. Objective-C の JSON 呼び出しを使用して画像をサーバーにアップロードできますか? それとも、画像をアップロードする方法を完全に変更する必要がありますか?
  2. 可能であれば、JSON から画像を取得するように Python サーバー コードを変更するにはどうすればよいですか?
4

1 に答える 1