HEYBlog about Technology

京都の学生エンジニアのエンジニアブログ

PHP curlで、ファイルアップロードして、Ruby Sinatraで受け取る

PHPで動かしているプロジェクトから、 Sinatraで動かしているプロジェクトに画像を転送しないといけない事案が発生したので書いてみた。

PHPの送信側

<?php

    $path = "./images/hoge.png";

    if(!file_exists($path)) {
        print "can't get image\n";
        return false;
    }

    $url = "アップロード先IP";
    $params = array('file'=>"@$path;type=image/png");

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, TRUE );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params );
    curl_exec($ch);
    curl_close($ch);


?>

ポイント

①$params = array('file'=>"@$path;type=image/png");

MIME TYPEの設定は;type=〇〇で書く。

ファイルを指定するときはアットマークを最初に書かなければならない

Sinatoraで動かしているプロジェクトで画像を受け取る

main.rb

# -*- coding: utf-8 -*-
require 'sinatra'
require 'erb'
#set :public_folder, File.dirname(__FILE__) + '/images/'

class MainApp < Sinatra::Base

  # アップロード処理
  post '/upload' do
    image_name =''
    unless params[:file]
      halt 400, 'No file'
    end

    image_name = params[:file][:filename]
    save_path = './images/'+image_name
    
    begin
      File.open(save_path, 'wb') do |f|
        p params[:file][:tempfile]
        f.write params[:file][:tempfile].read
      end
    rescue
      #No image 404
      halt 404, 'No file'
    end
    
    redirect image_name
  end

 
end