سؤال

لدي تطبيق PHP يقوم بإنشاء ملف CSV والذي يجب تنزيله باستخدام الرؤوس.إليك الجزء ذو الصلة من الكود:

header('Content-Type: application/csv'); 
header("Content-length: " . filesize($NewFile)); 
header('Content-Disposition: attachment; filename="' . $FileName . '"'); 
echo $content;
exit(); 

ما أود فعله هو إعادة توجيه المستخدمين إلى صفحة جديدة بعد إنشاء الملف وإرسال مطالبة التنزيل.مجرد إضافة header("Location: /newpage") لم ينجح الأمر حتى النهاية، كما هو متوقع، لذلك لست متأكدًا من كيفية تجهيز هذا الأمر.

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

المحلول

لا أعتقد أنه يمكن القيام بذلك، على الرغم من أنني لست متأكدًا بنسبة 100%.

الشيء الشائع (مثال:في مواقع التنزيل الشهيرة) هو العكس:أولا تذهب إلى بعد الصفحة ومن ثم يبدأ التنزيل.

لذا قم بإعادة توجيه المستخدمين إلى أخير الصفحة التي (من بين أمور أخرى) تقول:

يجب أن يبدأ التنزيل تلقائيًا.إذا لم يكن انقر فوق [a href="create_csv.php"]here[/a].

فيما يتعلق ببدء التنزيل (على سبيل المثال.عند الاتصال تلقائيًا بـ create_csv.php) لديك العديد من الخيارات:

  • لغة البرمجة: [meta http-equiv="refresh" content="5;url=http://site/create_csv.php"]
  • جافا سكريبت: location.href = 'http://site/create_csv.php';
  • إطار iframe: [iframe src="create_csv.php"][/iframe]

نصائح أخرى

من السهل جدا القيام به في حالة الحاجة إليها حقا.

ولكن سوف تحتاج إلى أن يكون العمل قليلا في جافا سكريبت والكوكيز:

وفي PHP يجب أن تضيف إنشاء ارتباط

header('Set-Cookie: fileLoading=true'); 

وبعد ذلك على الصفحة حيث يمكنك استدعاء تحميل يجب عليك أن تتبع مع JS (على سبيل المثال مرة واحدة في الثانية) إذا كان هناك الكعكة القادمة من هذا القبيل (هناك يستخدم البرنامج المساعد <لأ href = "https://github.com/carhartl/ مسج ملف تعريف الارتباط "يختلط =" noreferrer "> مسج الكعكة هنا):

setInterval(function(){
  if ($.cookie("fileLoading")) {
    // clean the cookie for future downoads
    $.removeCookie("fileLoading");

    //redirect
    location.href = "/newpage";
  }
},1000);

والآن إذا يبدأ الملف المراد downoaded JS يتعرف عليه والموجهات إلى الصفحة المطلوبة بعد حذف ملفات تعريف الارتباط.

وبطبيعة الحال، يمكن أن أقول لكم ما تحتاجه المتصفح لقبول ملفات تعريف الارتباط، وجافا سكريبت وهلم جرا، لكنه يعمل.

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

وهكذا إضافة رأس إعادة توجيه إلى أن يربك العملية برمتها من تحميل الملف (حيث يتم جمع رؤوس، ولدت في رأس واحد ثم إرسالها إلى المتصفح، يمكنك أن تجرب ذلك عن طريق وضع عدة IIRC إعادة توجيه رؤوس)

ونضع في اعتبارنا، ومع ذلك، بدء التلقائي للملفات للتحميل لمستخدمي IE سوف تؤدي إلى علامة التبويب تحذير أمان. كل ثلاثة من الأساليب التي يحددها daremon سوف تظهر هذا التحذير. كنت ببساطة لا يمكن التفاف على هذا. سوف يكون أفضل خدم إذا كنت توفير وصلات حقيقية.

ولقد وجدت الحل واحد لهذا تعتمد على جافا سكريبت، حتى انها ليست آمنة تماما، ولكن لمواقع حيوية غير آمن على ما يبدو للعمل.

هل لديك نموذج مع زر بعنوان "تنزيل" مع العمل المقرر أن نشير إلى البرنامج النصي تحميل، وضع ثم استخدام جافا سكريبت شيء على معالج onsubmit أن يستبعد على زر التحميل ويحل محل الرسائل التي تظهر على الشاشة. التحميل يجب ان يحصل وسوف الشاشة تتغير. من الواضح، إذا كان هناك مشكلة مع البرنامج النصي تحميل ثم أنها لا تزال تبدو وكأنه كان على حمل ناجح حتى لو كان لا يبدأ، ولكن هذا أفضل ما عندي في الوقت الحالي.

وهذه هي قضية قديمة جدا، ولكن هنا هو كيف يتحقق ذلك عن طريق JS.

// Capture the "click" event of the link.
var link = document.getElementById("the-link");
link.addEventListener("click", function(evt) {
  // Stop the link from doing what it would normally do.
  evt.preventDefault();
  // Open the file download in a new window. (It should just
  // show a normal file dialog)
  window.open(this.href, "_blank");
  // Then redirect the page you are on to whatever page you
  // want shown once the download has been triggered.
  window.location = "/thank_you.html";
}, true);

وفيا - <وأ href = "https://www.daniweb.com/web-development/php/threads/463652/page-not-redirecting-after-sending-headers-in-php" يختلط = "نوفولو "> https://www.daniweb.com/web-development/php/threads/463652/page-not-redirecting-after-sending-headers-in-php

<?php 
    function force_file_download($filepath, $filename = ''){
        if($filename == ''){
            $filename = basename($filepath);
        }

        header('Content-Type: application/octet-stream');
        header("Content-Transfer-Encoding: Binary"); 
        header("Content-disposition: attachment; filename=\"" . $filename . "\""); 
        readfile($filepath); // do the double-download-dance (dirty but worky)  
    }

    force_file_download('download.txt');
?>
<script type="text/javascript">
    location = 'page2.php'
</script>

وهنا هو الحل باستخدام جافا سكريبت.

ويمكنك محاولة إعادة توجيه إلى URL بالإضافة إلى المعلمة التي تمثل محتويات الملف. وفي إعادة التوجيه، يمكنك إخراج محتوى الملف للتحميل.

وإطلاق ملف PHP الذي يحتوي على CSV التحميل باستخدام:

<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a>

أو

<input name="newThread" type="button" value="Download CSV File"
        onclick="popoutWin(\'csvexport.php\')" />

وحيث وظيفة popoutWin جافا سكريبت

/*
 * Popout window that self closes for use with downloads
 */
function popoutWin(link){
    var popwin = window.open(link);
    window.setTimeout(function(){
        popwin.close();
    }, 500);
}

وهذا سيفتح نافذة، لعرض CSV تحميل موجه ثم قم بإغلاق فورا النافذة، ولم يتبق سوى المطالبة.

هنا هو الجواب:
إنه عمل!
تحتاج إلى ثلاثة أجزاء مختلفة من التعليمات البرمجية:

لغة البرمجة

<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a>


مسج

$('#download_btn').click(function(){
    window.location.href = '<?=base_url()?>/?file=<?=$file;?>&download=1';
}).focusout (function(){
    window.location.href = '<?=base_url()?>';
    return false;
});


بي أتش بي

        if(isset($_GET['download']) && isset($_GET['file'])){

            $zip_path = 'path_to/'.$_GET['file'].'.zip';

            if(file_exists($zip_path)){
                header('Content-Type: application/zip');
                header('Content-Disposition: attachment; filename="'.basename($zip_path).'"');
                header('Content-Length: ' . filesize($zip_path));
                header('Location: '.$zip_path);
            }

        }

وهمم ...

ضع التعليمات البرمجية أدناه في جافا سكريبت الرئيسي للموقع.

 if (window.location.pathname == '/url_of_redirect/') {
        window.open(location.protocol + '//' + location.hostname + '/url_of_download.zip', '_parent');
    }

وشرح: فإنه لا إعادة التوجيه العادي مع بي إلى بعض رابط سوف difine وفي javascipt تقول: إذا كان اسم المسار هو نفس المسار الذي إعادة التوجيه جعلت '/ url_of_redirect /' ثم فإنه يفتح رابط على صفحة جديدة، توليد downlod.

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