Vikram
Vikram

Reputation: 3361

Multiple simultaneous remote file downloads to server ruby on rails

How can be multiple files download to server simultaneous and check upload process ( I mean time left )

On rails application I have multiple text fields, they are for remote file urls like www.example.com/abc.pdf etc and these all files should be downloaded to a temp_uploads folder.

for this I have written code in remotefiles controller like below.

def remotefiles
    params[:reference_file_url].each do |rfile|
        temp_file = File.new("/public/temp_uploads", "w")
        open(temp_file, 'wb') do |file|
            file << open(rfile).read()
        end
    end
end

where rfile is remote file url.

I also have defined route remotefiles to call it in ajax

my ajax call sends form data in serialize format and this controller downloads all files 1 by 1.

with this code i have to wait untill all files are downloaded to folder that is obviously not acceptable.( I mean client asked me to reduce wait time by downloading all files simultaneous )

is there any way to get it done, all my code is custom and is not using any gem

Upvotes: 0

Views: 915

Answers (2)

Oshan Wisumperuma
Oshan Wisumperuma

Reputation: 1958

Let me answer the parallel file download part of the question. you can use a library like Typhoeus or em-http-request for that

#Typhoeus
hydra = Typhoeus::Hydra.new
params[:reference_file_url].each do |rfile|
  request = Typhoeus::Request.new(rfile, followlocation: true)
  request.on_complete do |response|
    #do_something_with response
  end
  hydra.queue(request)
end
hydra.run

Upvotes: 0

dinomix
dinomix

Reputation: 976

For local file upload: http://blueimp.github.io/jQuery-File-Upload/

For remote file download: You can use a gem called Sidekiq to write a background job which would use http to download each file. Then update Redis with the status and poll for that status via ajax from the browser.

To download the file you can use HTTPParty

require "httparty"

File.open("myfile.txt", "wb") do |f| 
  f.write HTTParty.get(remote_file_url).response
end

Upvotes: 1

Related Questions