PHP डाउनलोड करने के लिए संकेत दिए बिना फाइल को लिखें

निम्न कोड फ़ाइल में लिखने के लिए ठीक काम करता है, लेकिन मैं नहीं चाहता कि यह उपयोगकर्ता निष्पादित होने पर डाउनलोड करने के लिए संकेत देता है। मैं इसे रोकना चाहता हूं ... किसी भी मदद की सराहना की जाएगी। मैंने इसे एक ही परिणाम के साथ fwrite के साथ भी कोशिश की है।

$file_name = 'orders'.date('Ymd').'csv';
header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="'.$file_name.'"');
$data = array(
    'aaa,bbb,ccc,dddd',
    '123,456,789',
    '"aaa","bbb"'
);

$fp = fopen('php://output', 'w');
foreach ( $data as $line ) 
{
    $val = explode(",", $line);
    fputcsv($fp, $val);
}
fclose($fp);
1
Excel BIFF फ़ाइल के लिए सामग्री प्रकार application/vnd.ms-excel है, application/excel नहीं; और जब आप एक सीएसवी फ़ाइल भेज रहे हैं तो यह वास्तव में text/csv होना चाहिए
जोड़ा लेखक Mark Baker, स्रोत
इसे गुगल किया और वह कोड का हिस्सा था इसलिए मैंने माना कि यह आवश्यक था
जोड़ा लेखक ed209, स्रोत
@ user1815207 यह जरूरी है, वे सिर्फ यह नहीं जानते कि php://output क्या है।
जोड़ा लेखक Elon Than, स्रोत
इसका उपयोग क्यों कर रहे हैं? हेडर ('सामग्री-प्रकार: एप्लिकेशन/एक्सेल'); शीर्षलेख ('सामग्री-विस्थापन: अनुलग्नक; फ़ाइल नाम =' '। $ file_name।' ''); अगर आप फ़ाइल डाउनलोड नहीं करना चाहते हैं?
जोड़ा लेखक Marcel Balzer, स्रोत

3 उत्तर

ऐसा करने की संभावना नहीं है (या यहां तक ​​कि यदि कुछ चाल है, तो आपको इसका कभी भी उपयोग नहीं करना चाहिए!)। प्रॉम्प्ट से बचने का एकमात्र तरीका ब्राउज़र सेटिंग्स को बदलना है जो निश्चित रूप से उपयोगकर्ता द्वारा किया जा सकता है, न कि आपके द्वारा।

यह उपयोगकर्ता के लिए सुरक्षित नहीं होगा अगर कोई भी बिना किसी प्रॉम्प्ट के अपने कंप्यूटर पर फ़ाइलों को सहेजने में सक्षम होगा।

2
जोड़ा
मैं सर्वर को लिखने का इरादा रख रहा था ... किसी के कंप्यूटर नहीं।
जोड़ा लेखक ed209, स्रोत
मैं लगभग 13 घंटों तक प्रोग्रामिंग कर रहा हूं और मैं ज्यादा PHP लिखता नहीं हूं इसलिए कुछ खराब गुगल ने मुझे इस मार्ग से नीचे ले जाया
जोड़ा लेखक ed209, स्रोत
@ user1815207 तो php://output का उपयोग न करें और सर्वर फ़ाइल पथ का उपयोग न करें। उसके बाद, शीर्षलेख वाली रेखाएं हटाएं।
जोड़ा लेखक Elon Than, स्रोत

लाइनों को हटा दें

header('Content-Type: application/excel');
header('Content-Disposition: attachment; filename="'.$file_name.'"');

और यह सिर्फ फाइल लिख देगा।

जैसा कि है, ऐसा लगता है कि यह किसी भी सामग्री को किसी भी तरह से आउटपुट नहीं कर रहा है।

1
जोड़ा
@Elon अच्छा बिंदु, मैंने यह भी नहीं देखा था (सोचने के लिए fopen डिस्क पर एक फाइल को लिखना मतलब था ...)
जोड़ा लेखक JAL, स्रोत
वह php://output पर लिख रहा है, इसलिए यह कुछ आउटपुट करेगा :)
जोड़ा लेखक Elon Than, स्रोत

आप मिश्रण कर रहे हैं कि कैसे HTTP (विशेष रूप से शीर्षलेख) काम करता है और स्थानीय फाइलें।

ब्राउजर द्वारा HTTP प्रतिक्रिया का अर्थ जिस तरह से किया जाता है, हेडर (सामग्री-प्रकार, सामग्री-स्वभाव) का उपयोग करके सुझाव दिया जा सकता है। आपके ऑपरेटिंग सिस्टम और अनुप्रयोगों द्वारा फ़ाइल की व्याख्या करने का तरीका HTTP और HTTP शीर्षलेखों से कोई लेना देना नहीं है।

आपकी लिपि मूल रूप से दो चीजें करता है:

  1. एप्लिकेशन/एक्सेल अटैचमेंट के रूप में प्रतिक्रिया की व्याख्या करने के लिए ब्राउज़र (HTTP शीर्षलेखों के माध्यम से) को बताता है (ट्रिगर डाउनलोड करता है और ऑपरेटिंग सिस्टम की ज़िम्मेदारी पास करता है);

  2. कुछ सामान एक फ़ाइल में लिखता है।

आपको चरण (1) छोड़ना होगा।

साथ ही, यदि आपको विशेष मामलों में प्रदर्शन की परवाह नहीं है, तो file_put_contents enoguh होना चाहिए।

1
जोड़ा