Blog

Download private file trên S3 về browser trong rails

Nếu file trên S3 được public thì chỉ cần trả về url của file cho user, khi user click vào url đó trên browser thì họ sẽ download được.

>> Đọc thêm:

KHOÁ HỌC TRUY VẤN VÀ THAO TÁC DỮ LIỆU SQL TỪ CƠ BẢN ĐẾN NÂNG CAO

KHÓA HỌC DATA WAREHOUSE : TỔNG HỢP, CHUẨN HÓA VÀ XÂY DỰNG KHO DỮ LIỆU TRONG DOANH NGHIỆP

KHÓA HỌC DATA MODEL – THIẾT KẾ MÔ HÌNH DỮ LIỆU TRONG DOANH NGHIỆP

LỘ TRÌNH TRỞ THÀNH DATA ENGINEER CHO NGƯỜI MỚI BẮT ĐẦU

DATA ENGINEER LÀ GÌ? CÔNG VIỆC CHÍNH CỦA DATA ENGINEER? CÁC KỸ NĂNG CẦN THIẾT

Còn nếu file trên S3 là private và ta muốn download file thông qua API thì làm như sau:

  • Download S3 file rồi lưu về file tạm(temporary file) trên server.
  • Gửi nội dung file tạm về cho người dùng
  • Xóa file tạm trên server(có thể xóa hoặc không nhưng nên xóa đi)

Khi không cần xóa file tạm thì bạn chỉ cần làm như sau (ở đây mình dùng gem aws-sdk-resources, nếu bạn dùng gem khác thì gọi với API tương ứng):

def download
  s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
  obj = s3.bucket(ENV['BUCKET_NAME']).object("file_path_in_S3")
  tempFile = Tempfile.new('test')
  obj.get(response_target: tempFile.path)
  send_file(tempFile.read, filename: "file_name")
end

Khi gọi send_file Rails server sẽ gửi request tới HTTP server(Apache hoặc Nginx), HTTP server khi nhận được request send_file sẽ gửi file cho client. Vì thế, nếu ta xóa temp file ngay sau send_file sẽ phát sinh lỗi do Rails không biết được là HTTP server có đang sử dụng file tạm đó hay không.

Đoạn code sau sẽ trả về file không đúng cho client:

def download
  s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
  obj = s3.bucket(ENV['BUCKET_NAME']).object("file_path_in_S3")
  tempFile = Tempfile.new('test')
  obj.get(response_target: tempFile.path)
  send_file(tempFile.read, filename: "file_name")
  tempFile.unlink  # wrong here
end

Để xóa được file tạm thì thay vì dùng send_file ta dùng send_data như sau:

def download
  s3 = Aws::S3::Resource.new(region: ENV['AWS_REGION'])
  obj = s3.bucket(ENV['BUCKET_NAME']).object("file_path_in_S3")
  tempFile = Tempfile.new('test')
  obj.get(response_target: tempFile.path)
  File.open(tempFile.path, 'r') do |f|
    send_data(f.read, filename: "file_name")
  end
ensure
  if tempFile.present?
    tempFile.close
    tempFile.unlink
  end
end

Link tham khảo: https://stackoverflow.com/questions/5535981/what-is-the-difference-between-send-data-and-send-file-in-ruby-on-rails

Leave a Reply

Your email address will not be published. Required fields are marked *

Data Pola Mahjong Ways Terhadap Frekuensi Scatter yang Bisa Jadi Acuan Dinamika Tempo Permainan Terhadap Probabilitas Dan Pengambilan Keputusan Mengenal Pola Olympus Gate Tanpa Banyak Teori Efektivitas Keputusan Bermain Berdasarkan Jejak Statistik Pola Setiap Sesi Adaptasi Strategi Pemain Menghadapi Pergeseran Ritma Perilaku Elemen Digital Dinamika Distribusi Simbol Mengukur Potensi Siklus Pola Putaran Yang Makin Menarik Evaluasi Pergeseran Algoritma RNG Membentuk Peluang Putaran Persentase Teoritis Kajian Perilaku Kompetitif Pemain yang Membuat Putaran Berulang Membentuk Momentum Transisi Panduan Pemula Masuk Dunia Kasino Online Terbaru Setelah Update Pendekatan Statistik dalam Sesi Bermain Kasino Online Merespons Perubahan Formasi Reel Analisis Kemunculan Multiplier Sweet Bonanza Melalui Pendekatan Ritme Dinamis Starlight Princess Sajikan Scatter Ketika Fenomena Pola yang Sering Berubah-ubah Formasi Black Scatter Fitur Mahjong Wins 3 Mengukur Potensi Kemenangan Besar Pengelolaan Ritme Reel Membuka Peluang Strategis Dalam Meningkatkan Efektivitas Keputusan Pemain Menilai Efektivitas Kasino Online Terhadap Responsivitas Fitur Putaran Otomatis Mahjong Ways Evolusi Visual Integrasi Animasi Tradisional ke Distribusi Winrate Stabil Mengenal Pola Kartu Baccarat Kasino Online Tanpa Banyak Teori Analisis Pengaruh Ritme Pola Gates Of Olympus Terhadap Peluang Turunnya Multiplier Mengukur Efektivitas RNG Mahjong Wins Dalam Membaca Pergeseran Algoritma Cai Shen Wins Yang Menawarkan Hujan Koin Beri Dampak Terhadap Tingkat Retensi Pengguna Dinamika Pergeseran Simbol Starlight Princess Saat Tempo Mulai Dipercepat Secara Berkala Mengenal Black Scatter Mahjong Wins 3 Tanpa Pola Ribet Panduan Visual Membaca Pergerakan Formasi Mahjong Ways Tanpa Harus Bergantung Pada Teori Rumit Pemetaan Pola Dinamis dalam Membaca Perubahan Struktur Interaksi Digital Strategi Mengelola Momentum Taruhan Menggunakan Fitur Putaran Otomatis Yang Lebih Stabil Black Scatter RTP Yang Menawarkan Hasil Optimal Serta Peluang Jangka Panjang Distribusi Probabilitas Perkembangan Teknologi Bawa Baccarat ke Algoritma Sistem Otomatis Evaluasi Efektivitas Interaksi Digital Kemunculan Black Scatter Secara Beruntun Mengenal Pola Gold Scatter Starlight Princess Tanpa Banyak Teori Transformasi Mekanisme Sistem Dalam Stabilitas Persentase Peluang Kemenangan Pemain bujangjp slotsensa slot88 slot4d slot4d slot4d sv388 slot88 suhubet demo slot slot4d demo slot https://fabritec.pe/asesor.php suhubet bujangjp https://kibf.pk/ slotsensa buku303 slot4d sbobet slot gacor slot gacor slot gacor totogacor slot thailand https://www.jms.ac.in/admission-procedure/ slot gacor slot luar negeri slot gacor 4d totogacor slotsensa slot gacor slot gacor slotsensa https://adibintanpermata.com/ slot dana slot dana https://united-mgroup.com/ https://cliffcrestinn.com/ slot resmi demo slot totogacor totogacor demo slot slot 4d totogacor totogacor demo slot totogacor slot thailand totogacor bujangjp situs gacor 4D situs gacor Situs Gacor 4D Thailand Situs Gacor 4D SLOT4D bujangjp