Here's the solution for posterity. There were two problems to solve:
Recall that I'm using CarrierWave.
1) Heroku allows permissions only to the tmp directory. I needed to
specify the cache dir on the attachment uploader.
2) I needed to set content headers for s3. You can specify them when
you upload a file, and Amazon will provide them in the content headers
when you download a file.
So in my model (Mongoid), I have
class Report
include Mongoid::Document
...
mount_uploader :attachment, AttachmentUploader
And in my uploader, I have:
class AttachmentUploader < CarrierWave::Uploader::Base
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def s3_headers
{ "Content-Disposition" => "attachment; filename=export.csv;" }
end
# Use Heroku's temp folder for uploads
def cache_dir
"#{Rails.root}/tmp/uploads"
end
end
The s3 headers above set the content disposition type to attachment,
so it will download as a file instead of a page. The filename will set
the filename upon download.
The cache_dir sets the temp holding area for Heroku, since the
uploads/ directory is not public.
To upload an attachment, I say report.attach. That does this:
def attach(filename)
self.attachment = File.open(filename)
self.save
end
Hope this helps.
-bt
On May 5, 10:51 am, batate <[email protected]> wrote:
> I am uploading reports, via Carrierwave, to Amazon s3, but with
> protected urls. I'm able to process the upload fine, and I can see the
> file on Amazon, but it renders as text. I want it to trigger a browser
> download instead of just render the text.
>
> When I was generating the file via a template, I could control the
> headers and force the right download like this:
>
> helper_method :render_csv
> def render_csv(file, view=nil)
> filename = "export"
> filename = "user_export" if params[:action] == "process_users"
> filename ||= params[:action]
> filename += '.csv'
>
> (request.env['HTTP_USER_AGENT'] =~ /msie/i) ?
> set_ie_headers( filename ) : set_headers( filename )
> render :layout => false, :action => view
> end
>
> But now, I'm downloading from s3.
>
> Any suggestions?
--
You received this message because you are subscribed to the Google Groups
"Heroku" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/heroku?hl=en.