Как я могу добавить ссылку для скачивания к файлам в моем пространстве Digitalocean в моем приложении Rails?

#ruby-on-rails #ruby #digital-ocean

#ruby-on-rails #ruby #digital-ocean

Вопрос:

Я пытаюсь создать ссылку / кнопку для загрузки в моем приложении Rails, чтобы пользователи могли загружать файлы из моего пространства Digitalocean. Я хочу иметь возможность нажать кнопку загрузки на моей странице показа и загрузить файл. Вот что я пробовал до сих пор:

samples_controller.rb

 def show
  @sample = Sample.find(params[:id])
  data = open(@sample.audio_url) 
  @sample_download = send_data data.read, filename: @sample.audio.metadata["filename"], type: @sample.audio.metadata["mime_type"], disposition: 'inline' 
end
 

show.html.erb

 <%= link_to "Download Sample", @sample_download %>
 

Когда я загружаю страницу показа, открывается страница, которая воспроизводит аудиофайл. Я хочу, чтобы мой шаблон показа отображался как обычно, и мог щелкнуть ссылку для загрузки файла. Может быть, у меня должен быть отдельный download_sample метод, я не уверен.

Ответ №1:

Вы можете запустить загрузку на стороне браузера, используя download атрибут <a> тега.

Все, что вам нужно, это что-то вроде <a href="http://linktofile.com/audio.mp3" download>Download</a> , и пользователь может нажать на ссылку для загрузки.

Используя помощник Rails, вы можете сделать <%= link_to "Download", @sample.audio_url, download: true %>

Комментарии:

1. Это все равно просто открывает страницу, которая воспроизводит аудиофайл, вместо того, чтобы оставаться на странице показа и загружать файл.

2. Современные браузеры должны учитывать этот download атрибут. Если это не сработает, вам может потребоваться проверить правильность вашего вывода HTML. Вы можете проверить пример W3school

Ответ №2:

Привет для контента с другого веб-сайта убедитесь, что ссылка является прямой ссылкой. Если данные, которые вы хотите загрузить, находятся в активном хранилище, посмотрите rails_blob_path (здесь ) .

В вашей модели

 Class Sample < ApplicationRecord
     has_one_attached :data
end
 

В вашем контроллере

   class SampleController < ApplicationController

    def show
     @sample = Sample.find(params[:id])
     @sample_download =  rails_blob_path(@sample.data, disposition: 'attachment')
    end
  end
 

В ваших представлениях

 <%=link_to "Download", @sample_download %>

 

Комментарии:

1. Спасибо за ответ. На самом деле я использую Shrine для загрузки в DO Spaces, а не в Active Storage.