27404
下記を参考にしながら、アプリからサーバーに送られてきたバイナリデータをオブジェクトストレージにアップロード(保存)したいのですが、どうしてもうまくいきません。  
[ConoHaオブジェクトストレージを使ってみよう(REST
API編)](https://www.conoha.jp/conoben/archives/3429)

検索しながら色々試しているのですが、その中の一つが下記の記述になります。

```

    $image_binary = $_POST['image'];
    
    
    $curl = curl_init();
    
    $fp = tmpfile();
    fwrite($fp, $image_binary, strlen($image_binary));
    fseek($fp, 0, SEEK_SET);
    
    $headers = array(
        'X-Auth-Token: ' . AUTH_TOKEN,
        'Content-Type: image/jpeg',
    );
    
    $options = array(
        CURLOPT_PUT => true,
        CURLOPT_INFILE => $fp,
        CURLOPT_URL =>  [エンドポイントURL]/[アカウント名]/[コンテナ名]/[オブジェクト名],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => $headers,
    );
    
    curl_setopt_array($curl, $options);
    
    
    
    $body = curl_exec($curl);
    if(curl_errno($curl)) {
        $msg = sprintf('cURL error: %s', curl_error($curl));
        throw new RuntimeException($msg);
    }
    
    $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    if($status_code != 201) {
        $msg =sprintf('Error. The server returned status code(%d).', $status_code);
        throw new RuntimeException($msg);
    }
    $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    echo "status code: " . $status_code . "\n";
    
```

そうしますと下記のようなエラーが出ます。

```

    Warning: fwrite() expects parameter 1 to be resource, boolean given in
    Warning: fseek() expects parameter 1 to be resource, boolean given in
    Warning: curl_setopt_array(): supplied argument is not a valid File-Handle resource in
    
```

そもそも、画像を送信するときは下記のようなファイル書き込みのような作業は必要なのでしょうか？

```

    $fp = tmpfile();
    fwrite($fp, $image_binary, strlen($image_binary));
    fseek($fp, 0, SEEK_SET);
    
```

それと、できればオブジェクトストレージに保存したあとは、保存場所のURLにアクセスすると閲覧できるようにしたいと思っているのですが、その場合バイナリデータで保存するのではなく、下記のように、デコードして保存するべきなのでしょうか？  
できればそのやりかたも知りたいです。

```

    $photo = base64_decode($image_binary);
    
```

間違いだらけのコードのような気がしてしょうがないのですが、参考になるURLや助言をいただけると大変助かります。  
よろしくお願いします。

ーーー追記ーーー  
情報不足でしたので追記します。  
下記の部分は、すでにアプリ側で文字列（BASE64）に変換したものを渡しています。

```

    $image_binary = $_POST['image'];
    
```
CC BY-SA 3.0
2016-07-06T05:16:17.180
27372
2022-09-20T02:41:34.100
2022-09-20T02:41:34.100
3060
16955
question
php conoha php-curl
ConoHaのオブジェクトストレージへ画像のアップロード方法
tmpfile()がfalseを返していると思います。ただ、その場合何かしらPHPのエラーが出るはずですが・・・。

エラーの原因は色々あります。sys_get_temp_dir()で一時ファイルが作られるディレクトリが取れるので、そこに対して書き込みパーミッションがあるか、ディスク容量は十分にあるか、などを確認頂くのが良いと思います。

> そもそも、画像を送信するときは下記のようなファイル書き込みのような作業は必要なのでしょうか？

CURLOPT_INFILEにはリソース型しか渡せないため、一度ファイルに書き込んでそのファイルポインタ($fp)を渡すようにしています。

>
> それと、できればオブジェクトストレージに保存したあとは、保存場所のURLにアクセスすると閲覧できるようにしたいと思っているのですが、その場合バイナリデータで保存するのではなく、下記のように、デコードして保存するべきなのでしょうか？

オブジェクトストレージは画像データをそのまま保存できます。base64エンコードして保存する必要はありません。base64_decodeしたデータを一時ファイルに書き込んで、そのままアップロードすれば良いです。
CC BY-SA 3.0
2016-07-07T04:48:02.417
27404
2016-07-07T04:48:02.417
7651
27372
answer