4

Android アプリケーションから受け取った base64 でエンコードされた画像をアップロードする必要があります。私はphp codeigniterフレームワークを使用しています。フォーラムを検索している間、このリンクの質問codeigniter で base64 でエンコードされた画像をアップロードする方法は私のものと同じですが、そこの解決策は私にとってはうまくいきません。

ここに私が書いたコードがあります:

private function _save_image() {
    $image = base64_decode($_POST['imageString']);
    #setting the configuration values for saving the image
    $config['upload_path'] = FCPATH . 'path_to_image_folder';
    $config['file_name'] = 'my_image'.$_POST['imageType'];
    $config['allowed_types'] = 'gif|jpg|jpeg|png';
    $config['max_size'] = '2048';
    $config['remove_spaces'] = TRUE;
    $config['encrypt_name'] = TRUE;


    $this->load->library('upload', $config);
    if($this->upload->do_upload($image)) {
        $arr_image_info = $this->upload->data();
        return ($arr_image_info['full_path']);
    }
    else {
        echo $this->upload->display_errors();
        die();
    }
}

「アップロードするファイルが選択されていません」というメッセージが表示されます

御時間ありがとうございます。

4

2 に答える 2

5

このエラーは、codeigniter のアップロード ライブラリが$_FILESスーパーグローバルを調べて、呼び出し時に指定したインデックスを検索するために発生していdo_upload()ます。

さらに (少なくともバージョン 2.1.2 では) $_FILES スーパーグローバルを設定してファイル アップロードの動作を模倣したとしても、アップロード ライブラリはis_uploaded_fileを使用してスーパーグローバルのそのような改ざんを正確に検出するため、パスしません。system/libraries/Upload.php:134 でコードをトレースできます

サイズチェックとファイルの名前変更と移動を再実装する必要があることを恐れています (私はこれを行います)、または codeigniter を変更してそのチェックを省略できますが、後でフレームワークをアップグレードするのが難しくなる可能性があります。

  1. $_FILES$image 変数の内容を一時ファイルに保存し、次のように設定します。

     $temp_file_path = tempnam(sys_get_temp_dir(), 'androidtempimage'); // might not work on some systems, specify your temp path if system temp dir is not writeable
     file_put_contents($temp_file_path, base64_decode($_POST['imageString']));
     $image_info = getimagesize($temp_file_path); 
     $_FILES['userfile'] = array(
         'name' => uniqid().'.'.preg_replace('!\w+/!', '', $image_info['mime']),
         'tmp_name' => $temp_file_path,
         'size'  => filesize($temp_file_path),
         'error' => UPLOAD_ERR_OK,
         'type'  => $image_info['mime'],
     );
    
  2. アップロード ライブラリを変更します。コードイグナイターの組み込み方法で Extending Native Librariesを使用し、 My_Upload (またはプレフィックス) クラスを定義し、 do_upload 関数をコピーして貼り付け、次の行を変更できます。

    public function do_upload($field = 'userfile')
    

    に:

    public function do_upload($field = 'userfile', $fake_upload = false)
    

    そしてその:

    if ( ! is_uploaded_file($_FILES[$field]['tmp_name']) )
    

    に:

    if ( ! is_uploaded_file($_FILES[$field]['tmp_name']) && !$fake_upload )
    

    コントローラーで、流れるパラメーターを指定して do_upload() を呼び出します。

    $this->upload->do_upload('userfile', true);
    
于 2012-07-20T12:07:11.673 に答える
1

Base64でエンコードされた画像を文字列として受信している場合は、Uploadクラスを使用する必要がないことに注意してください。

代わりに、base64_decodeを使用してデコードしてから、fwrite/file_put_contentsを使用してデコードされたデータを保存する必要があります...

$img = imagecreatefromstring(base64_decode($string)); 
if($img != false) 
{ 
   imagejpeg($img, '/path/to/new/image.jpg'); 
}  

クレジット: http: //board.phpbuilder.com/showthread.php?10359450-RESOLVED-Saving-Base64-image

于 2012-07-20T14:11:15.363 に答える