سؤال

أنا أستخدم الجمبري والقريدس لإنشاء ملف PDF في تطبيق Ruby On Rails (الإصدار 2.2.2) الذي يعمل بشكل رائع وينشئ PDFs بسعادة ويرسلها إلى المستخدم للتنزيل في Firefox.

المشكلة في IE7.

لدي طريق تم إعداده مثل:

map.invoice_pdf '/invoices.pdf', :controller => 'invoices', 
                :action => 'index', :format => 'pdf'

الذي لدي رابط مثل ذلك للاتصال:

invoice_pdf_path(:year => params[:year], :month => params[:month], 
                 :unpaid_only => params[:unpaid_only])

وما يلي في وحدة التحكم الخاصة بي:

 def index
    params[:year]  = default params[:year]
    params[:month] = default params[:month]
    params[:page] ||= 1

    @invoices = Arobl.find_invoices_for_customer(current_customer.strCustomerID,
                       params)

    respond_to do |format|
      format.html{ render :action => 'index' }
      format.pdf{
        prawnto :inline => false, :filename => 
                "#{current_customer.strCustomerID}_invoice.pdf"
  end

في FF ، يعمل هذا كما هو متوقع ، عند النقر فوق الرابط ، يتم استدعاء إجراء العرض بتنسيق .pdf ، ويستجيب بـ PDF المسمى بشكل صحيح. عندما يتم ضربه مع IE7 ، فإنه لا يمكن العثور على الملف أو موقع الويب ، والمراجع "الفواتير.

أي فكرة عما يمكن أن يسبب هذا السلوك؟

شكرًا!

هل كانت مفيدة؟

المحلول 4

كحل مؤقت ، استخدمت النهج الموثق هنا: http://chelsearbb.wordpress.com/2009/09/09/saving-a-prawn-pdf-to-file/ وقم بحفظ الملف محليًا ، واستخدم send_data و file.read ، ثم حذف الملف الذي يبدو أنه يعمل بشكل جيد في جميع المتصفحات.

ما زلت أشعر بالفضول حول سبب عدم عمله في IE7 سابقًا.

نصائح أخرى

أواجه هذه المشكلة أيضًا. عندما أحاول أن أطلب نفس PDF بدون SSL على Internet Explorer (7 أو 8) ، فهو يعمل ، ولكن إذا طلبت ذلك مع SSL ، فإنه لا يعمل ...

نعتقد أننا قد نتعقب هذا إلى الرؤوس التي تتوقعها IE عند تنزيل PDF. لم أتحقق من رمز المصدر الربيدي لمعرفة الرؤوس التي حددها ، لكن من المحتمل أن نستخدم بعض البرامج الوسيطة على الرف لضخ الرؤوس التي نحتاجها:

# add headers for PDF downloads in IE
# PDFs not downloading correctly via SSL in IE
# solution: add some headers for PDF downloads
# http://marc.info/?l=php-general&m=124301243808544&w=2
class RackAddPdfHeadersForIe
  def initialize( app )
    @app = app
  end

  def call( env )
    @status, @headers, @body = @app.call env
    add_headers if is_pdf? and is_internet_explorer?        
    [@status, @headers, @body]
  end

  def is_pdf?
    @headers['Content-Type'] =~ /pdf/
  end

  def is_internet_explorer?
    @headers['User-Agent'] =~ /MSIE ([0-9]{1,}[\.0-9]{0,})/
  end

  def add_headers
    @headers['Content-Description'] = 'File Transfer'
    @headers['Content-Transfer-Encoding'] = 'binary'
    @headers['Expires'] = '0'
    @headers['Pragma'] = 'public'
  end      
end

لذلك جربت هذا ، اعتقدت أنه سيعمل ، ثم وجدت أنه في الواقع لم ينجح.

لذلك انتهى بي الأمر القيام بذلك ، لأي سبب من الأسباب ، لقد نجح هذا بالنسبة لي:

class ReportsController < ApplicationController

  def payroll_summary
    respond_to do |format|
      format.pdf do 
        response.headers['Content-Disposition'] = "attachment;filename=\"#{action_name}.pdf\""
        response.headers['Content-Description'] = 'File Transfer'
        response.headers['Content-Transfer-Encoding'] = 'binary'
        response.headers['Expires'] = '0'
        response.headers['Pragma'] = 'public'
        render
      end  #format.pdf
    end #respond_to
  end #payroll_summary

end

تم شرح قضية IE هذه في http://support.microsoft.com/kb/323308

الحل هو ضبط رأس التحكم في ذاكرة التخزين المؤقت إلى شيء آخر غير متجر مع شيء مثل:

response.headers["Cache-Control"] = "private, max-age=0, must-revalidate"

من المحتمل أن يصادف المزيد من الأشخاص في هذا الأمر ، حيث يبدو أن Rails 2.3.6+ يضعون التحكم في ذاكرة التخزين المؤقت إلى أي متجر لم تكن الإصدارات السابقة.

لقد طاردت مشكلتي إلى ملف Compile_Support.rb الخاص بـ Prawnto.

  # added to make ie happy with ssl pdf's (per naisayer)
  def ssl_request?
    @controller.request.env['SERVER_PROTOCOL'].downcase == "https"
  end

كنا نرى أن متغير env من Apache Server_protcol تم تعيينه دائمًا على HTTP/1.1 حتى عند استخدام HTTPS. متى SSL_Required؟ كاذب وهو طلب من IE prawnto سوف يعين pragma = "عدم وجود آذان". هذا هو ما كان يسبب قضايانا.

إذا كان تطبيقك يستخدم HTTPS فقط ، فيمكنك تغيير هذه الوظيفة لإرجاع True دائمًا. إذا لم يكن هذا كافياً ، يمكنك كتابة توجيه Apache على غرار:

setenv server_protocol "https"

لقد وضعت هذا بشكل صحيح في ملف ssl.conf الخاص بي وكل شيء يعمل الآن كما هو متوقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top