Rails newbie in dire need of help - File uploading

Hey there,

I'm new to Ruby on Rails. REALLY new. So far, I've managed to create an app, a controller, a route and I've managed to push this plain-text application to Heroku and deploy it there.

The app is supposed to be a image uploading website, but instead of just storing the files on the file system, it should cURL the data to an image hoster's API and return the image links.

The main problems I'm facing are..

- I have never worked with MVC before - I'm pretty good with PHP but I completely suck at RoR - Storing files on Heroku's file system is not allowed

But how am I supposed to send files via cURL if I'm not allowed to store them on the file system?

I'd be really grateful for any newbie-friendly advice on this.

Thanks!

Look at the paperclip plugin; it can store uploaded files on Amazon S3, for instance, so even if you're using some other storage it should give you some ideas.

And FWIW I've used it for exactly your use case of deploying an app with an image (photo) upload to Heroku.

Hey Hassan,

thanks for your reply. Paperclip looks interesting, but as of what Google says, it does not support cURL. I've already built a PHP image uploading API, and I want to use it with Rails. Is there any way to accomplish that or do I have to use PHP?

Thanks

I'm not sure what you're asking -- you want to use PHP in a Rails app that runs on Heroku?

No, i've already built a PHP script which can be used to upload images via HTTP POST. Now I'm trying to build some sort of graphical interface with Rails. Thus, this GUI app would need to use cURL to transfer the uploaded images to the API script.

Sorry, I'm not following you at all.

You have a Rails app on Heroku, and you want to store images for that app somewhere. So why not just use Paperclip? What's the point of a separate upload mechanism?

He has a PHP script that do "the thing" with amazon, but now he needs to tailor the Rails front-end app with that script through cURL. Right Moritz?

You can execute cURL through Rails controllers like:

class SomeController < ...   def execute_my_php_script     `curl http://myscript.moritz.com [options]` # you need to know how to run curl properly here   end end

- I have never worked with MVC before - I'm pretty good with PHP but I completely suck at RoR

Cheers! Jakub Godawa

Yes exactly Jakub! The main problem is that Heroku (The hoster) does not allow any storing of files on their filesystem. Is there any other way?

Sorry, I still don't get it. Why not just use Paperclip and forget about trying to kludge together something with PHP?

Hey there,

okay once again :slight_smile:

I have already coded an image uploading API using PHP. This API can be accessed and used to upload images via cURL. For anyone interested, said API is public and fully working.

Example: curl -F "@picture.jpg" imagecloud.us - This website is for sale! - imagecloud Resources and Information.

-> Will return a JSON-encoded response including image URL etc.

To learn Rails, I want to create a graphical interface for this API. The problem is, the hoster I want to host this Rails GUI on does not allow the storing of files on the filesystem. Thus, putting the files in a temp directory on the filesystem and then transferring them is NOT an option.

Sorry if my posts are a bit complicated, I'm from Germany and not really used to the english language.

Thanks!

Could you use a form in your upload page that sets up a direct post to your imagecloud server, and sends along a unique identifier with that file? Then your imagecloud could post-back with the create file's metadata, and your Rails app could listen for that and update the record asynchronously.

Walter

Ah that'd actually work, yeah! :slight_smile:

How would I set up such a form with Rails?

Just found something on Ruby on Rails Guides:

http://guides.rubyonrails.org/form_helpers.html#uploading-files

Especially this code part:

def upload   uploaded_io = params[:person][:picture]   File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|     file.write(uploaded_io.read)   end end

Wouldn't you be able to, instead of file.write, transfer the files via cURL?

Yes, I think that's what one of the other people on this list was saying in this thread. Ruby has cURL support baked in, and you can invoke it directly within your Rails app as long as you know the correct command format.

Walter

There are View Helper functions for building a generic form -- one not bound to a particular model instance. Have a look at the form_tag helper in the documentation. That can build any sort of form tag, pointed anywhere. Within it, you would put your unique identifier. You're showing this form to an authenticated user, so you could do something where you stash that user's id concatenated the current time in milliseconds or something like that. Persist that in your database, in the same table where you will eventually have all the details about your cloudy file. Then express that key as a hidden form element in your upload form.

Walter

instead of passing picture.jpg to imagecloud couldnt you pass [:person][:photo] to imagecloud? You shouldnt need to write anything, simply pass the raw data to imagecloud