allow streaming downloads to export channel feed data
This commit is contained in:
83
app/controllers/stream_controller.rb
Normal file
83
app/controllers/stream_controller.rb
Normal file
@ -0,0 +1,83 @@
|
||||
class StreamController < ApplicationController
|
||||
include ActionController::Live
|
||||
require 'csv'
|
||||
|
||||
def channel_feed
|
||||
channel = Channel.find(params[:id])
|
||||
api_key = ApiKey.find_by_api_key(get_apikey)
|
||||
|
||||
# set timezone correctly
|
||||
set_time_zone(params)
|
||||
|
||||
# output proper http response if error
|
||||
render :text => '-1', :status => 400 and return if !channel_permission?(channel, api_key)
|
||||
|
||||
# set the attachment headers
|
||||
response.headers['Content-Type'] = 'text/csv'
|
||||
response.headers['Content-Disposition'] = 'attachment; filename=feeds.csv'
|
||||
|
||||
# get the feed headers
|
||||
csv_headers = Feed.select_options(channel, params)
|
||||
|
||||
# set the total records and batch size
|
||||
total_records = channel.feeds.count
|
||||
batch = 1000
|
||||
|
||||
# write the headers row
|
||||
response.stream.write "#{CSV.generate_line(csv_headers)}"
|
||||
|
||||
# for every 1000 records
|
||||
(0..(total_records - batch).abs).step(batch) do |i|
|
||||
# variable to hold the streaming output for this batch
|
||||
batch_output = ""
|
||||
# feeds query
|
||||
feeds = Feed.where(:channel_id => channel.id).order('entry_id asc').offset(i).limit(batch)
|
||||
|
||||
# for each feed, add the data according to the csv_headers
|
||||
feeds.each do |feed|
|
||||
row = []
|
||||
csv_headers.each { |attr| row.push(feed.send(attr)) }
|
||||
batch_output += CSV.generate_line(row)
|
||||
end
|
||||
|
||||
# write the output for this batch
|
||||
response.stream.write batch_output
|
||||
# add a slight delay between database queries
|
||||
sleep 0.1
|
||||
end
|
||||
ensure
|
||||
response.stream.close
|
||||
end
|
||||
|
||||
def stream_example
|
||||
# get the channel
|
||||
channel = Channel.find(params[:channel_id])
|
||||
|
||||
# stream the response
|
||||
response.headers['Content-Type'] = 'text/csv'
|
||||
response.headers['Content-Disposition'] = 'attachment; filename=feeds.csv'
|
||||
20.times {
|
||||
response.stream.write "hello world\n"
|
||||
sleep 1
|
||||
}
|
||||
ensure
|
||||
response.stream.close
|
||||
end
|
||||
|
||||
def stream_chunked_example
|
||||
#response.headers['Content-Type'] = 'text/event-stream'
|
||||
response.headers['Content-Type'] = 'text/csv'
|
||||
response.headers['Content-Disposition'] = 'attachment; filename=feeds.csv'
|
||||
response.headers['Transfer-Encoding'] = 'chunked'
|
||||
10.times {
|
||||
response.stream.write "4\n" # size must be in hex format?
|
||||
response.stream.write "hel\n\n"
|
||||
sleep 1
|
||||
}
|
||||
response.stream.write "0\n\n"
|
||||
ensure
|
||||
response.stream.close
|
||||
end
|
||||
|
||||
end
|
||||
|
@ -1,4 +1,5 @@
|
||||
<div class="FL">
|
||||
<h3><%= t(:import) %></h3>
|
||||
<%= t(:upload_select) %>
|
||||
<br>
|
||||
|
||||
@ -11,6 +12,12 @@
|
||||
<%= f.submit t(:upload), :disable_with => t(:uploading) %>
|
||||
<% end %>
|
||||
|
||||
<br><br>
|
||||
|
||||
<h3><%= t(:export) %></h3>
|
||||
<%= t(:download_feeds) %>
|
||||
<br><br>
|
||||
<%= button_to t(:download), "#{@ssl_api_domain}stream/channels/#{@channel.id}/feeds?api_key=#{@channel.write_api_key}" %>
|
||||
</div>
|
||||
|
||||
<div id="sidebar_old" >
|
||||
|
@ -24,7 +24,7 @@ Valid parameters:
|
||||
<li><b>elevation</b> (integer) - Elevation in meters (optional)</li>
|
||||
<li><b>status</b> (string) - Status update message (optional)</li>
|
||||
<li><b>twitter</b> (string) - Twitter username linked to <a href="/docs/thingtweet">ThingTweet</a> (optional)</li>
|
||||
<li><b>tweet</b> (string) - Twitter status update (optional)</li>
|
||||
<li><b>tweet</b> (string) - Twitter status update; see <a href="/docs/thingtweet#update">updating ThingTweet</a> for more info (optional)</li>
|
||||
<li><b>created_at</b> (datetime) - Date when this feed entry was created, in the format<br>YYYY-MM-DD%20HH:NN:SS (optional)</li>
|
||||
</ul>
|
||||
|
||||
|
Reference in New Issue
Block a user