วิธีส่งไฟล์ที่สร้างขึ้นแบบไดนามิกในแอป Rails

ฉันกำลังพยายามให้บริการไฟล์ที่สร้างขึ้นแบบไดนามิกในแอป Rails ดังนั้นเมื่อผู้ใช้คลิกลิงก์ใดลิงก์หนึ่ง ไฟล์จะถูกสร้างขึ้นและส่งไปยังไคลเอนต์โดยใช้ send_data

ไฟล์นี้ไม่ได้ตั้งใจที่จะนำมาใช้ซ้ำ: เป็นไฟล์ข้อความสั้น ๆ และการสร้างใหม่ควรมีราคาไม่แพงมากเนื่องจากจะไม่มีการอัพโหลดมากนัก แต่ถ้าจำเป็นหรือสะดวกก็สามารถเก็บไว้ในฐานข้อมูลได้จึงสร้างเพียงครั้งเดียว

ก่อนอื่น ฉันต้องการสร้างไฟล์ในหน่วยความจำ และส่งไปยังคอนโทรลเลอร์ ฉันกำลังพยายามเก็บถาวรสิ่งนี้:

def DownloadsController < ApplicationController
  def project_file
    project = Project.find(params[:id])
    send_data project.generate_really_simply_text_file_report
  end
end

แต่ฉันไม่รู้วิธีสร้างสตรีมในหน่วยความจำ ดังนั้นจึงไม่มีการสร้างไฟล์ในระบบไฟล์

อีกทางเลือกหนึ่งคือการสร้างไฟล์ด้วยชื่อแบบสุ่มในไดเร็กทอรี tmp ของแอป Rails และส่งจากที่นั่น แต่ไฟล์นั้นจะถูกเก็บไว้ที่นั่น ซึ่งเป็นสิ่งที่ฉันไม่อยากให้เกิดขึ้น

แก้ไข: ถ้าฉันจำไม่ผิด send_file จะบล็อกคำร้องจนกว่าไฟล์จะถูกส่งจึงจะทำงานได้...

คำแนะนำหรือความคิดเห็นอื่นใด?

ขอบคุณล่วงหน้า


person Ricardo Amores    schedule 04.02.2010    source แหล่งที่มา


คำตอบ (1)


หากเป็นปัญหาง่ายๆ อย่างที่คุณอธิบายไว้ วิธีแก้ไขง่ายๆ เช่นนั้นก็ใช้ได้ อย่าลืมตัวเลือก :filename มิฉะนั้นไฟล์จะมีชื่อว่า "project_file"

  def project_file
    project = Project.find(params[:id])
    send_data project.generate_really_simply_text_file_report, :filename => "#{project.name}.txt"
  end

แก้ไข:

project#generate_really_simply_text_file_report ของคุณควรส่งคืนข้อมูลไบนารี เส้นทางสำหรับไฟล์ หรือสตริงดิบ

  def download
    content = "chunky bacon\r\nis awesome"
    send_data content,  :filename => "bacon.txt" 
  end
person Lucas    schedule 04.02.2010
comment
ปัญหาของฉันคือฉันไม่รู้วิธีสร้างข้อมูลไบนารี่ที่จะส่งในหน่วยความจำ - person Ricardo Amores; 04.02.2010
comment
ขอบคุณ! ฉันลงเอยด้วยการใช้เทมเพลต erb พร้อมวิธี render_to_string เพื่อสร้างข้อมูลสตริง - person Ricardo Amores; 04.02.2010