2009-08-28 4 views
5

मेरा वेब ऐप CGI :: एप्लिकेशन का उपयोग करके अपाचे mod_perl पर चलता है। मैं एक जेनरेट की गई फाइल का एक डाउनलोड प्रदान करना चाहता हूं। अतीत में (इससे पहले कि हम mod_perl और सीजीआई :: ऐप का उपयोग कर रहे थे) मैंने उत्पन्न होने के बाद STDOUT पर एक सीएसवी फ़ाइल को स्पूल कर दिया था। अब मैं थोड़ा और परिशोधन के लिए शूटिंग कर रहा हूं - स्प्रेडशीट :: लिखित एक्सेल का उपयोग कर एक्सेल स्प्रेडशीट बनाना - और मुझे फ़ाइल हैंडल से इसे प्रिंट करने के लिए प्रतीत नहीं होता है।मैं mod_perl और CGI :: एप्लिकेशन का उपयोग करके एक temp फ़ाइल डाउनलोड कैसे प्रदान कर सकता हूं?

sub export_list { 
    my $self = shift; 

    binmode(STDOUT); 
    my $str; 
    open my $fh, '>', \$str; 
    my $workbook = Spreadsheet::WriteExcel->new($fh); 
    my $worksheet = $workbook->add_worksheet(); 

    $worksheet->write_col(0,0, ['some','data','here']); 
    warn $str; 
    return $str; 
} 

आउटपुट सिर्फ एक खाली प्रतिक्रिया है, और चेतावनी भी खाली है।

जिस विधि का मैं स्प्रेडशीट को फ़ाइलहेडल में लिखने के लिए उपयोग कर रहा हूं वह documentation से काफी सीधे है, इसलिए मुझे लगता है कि समस्या मेरे सीजीआई :: ऐप नोबरी के कारण है। फ़ाइल हैंडल के लिए प्रलेखन के सुझाए गए तरीकों और mod_perl भी काफी फलहीन साबित हुए।

मुझे लगता है कि मुझे जिक्र करना चाहिए कि मैं विंडोज़ पर चल रहा हूं, और मेरा वर्तमान कामकाज फाइल बनाने और उपयोगकर्ता को इसके लिंक के साथ प्रदान करना है। हालांकि, निर्देशिका को साफ़ करने और ऐसा करने के लिए, और जेनरेट की गई फ़ाइलों तक पहुंच के लिए प्रमाणीकरण के संबंध में, इससे अधिक समस्याएं उत्पन्न होती हैं।

सुझाव? आलोचना की आलोचना?

उत्तर

4

आप STDOUT साथ गड़बड़ करने की जरूरत नहीं होनी चाहिए; सीजीआई-ऐप को हुड के नीचे आपके लिए ठीक से संभालना चाहिए। डेटा भेजने की कोशिश करने से पहले आपको फ़ाइलहेडल को बंद करने की भी आवश्यकता होगी।

ऐसा लगता है कि आप Excel डेटा के लिए उचित सामग्री प्रकार सेट नहीं कर रहे हैं। टेक्स्ट/एचटीएमएल के अलावा किसी अन्य चीज़ के लिए, आपको इसे मैन्युअल रूप से सेट करने की आवश्यकता होगी। कुछ इस तरह का प्रयास करें:

sub export_list { 
    my $self = shift; 

    my $str; 
    open my $fh, '>', \$str or die "Can't open to var: $!"; 
    my $workbook = Spreadsheet::WriteExcel->new($fh); 
    my $worksheet = $workbook->add_worksheet(); 

    $worksheet->write_col(0,0, ['some','data','here']); 

    $workbook->close; 
    close $fh; 

    warn $str; 

    $self->header_add(-type => 'application/vnd.ms-excel'); 
    return $str; 

}

तुम भी इसके बजाय स्मृति में पूरे स्प्रेडशीट बनाने की CGI::Application::Plugin::Stream

+0

हाँ मुझे लगता है कि फाइलहैंडल को बंद करने से यह चर को फ्लश करने के लिए मजबूर करता है ताकि मैं इसे वापस कर सकूं। साथ ही, मुझे हेडर में '-attachment =>' filename.xls'' 'जोड़ना पड़ा था या फ़ायरफ़ॉक्स फ़ाइल के साथ क्या करना है, यह नहीं पता था। मैं CGI :: ए :: पी :: स्ट्रीम में देखूंगा, लेकिन जो फाइलें हम बना रहे हैं, वह महत्वपूर्ण नहीं होनी चाहिए। धन्यवाद! – wes

3

आप कार्यपुस्तिका को बंद करना चाहते हैं। इसके अलावा filehandle बंद:

warn "length 1=".length($str); 
$workbook->close(); 
close($fh) or die "error on close: $!"; 
warn "length 2=".length($str); 

length 1=0 at wx.pl line 16. 
length 2=5632 at wx.pl line 19. 
4

में रुचि हो सकती है, तो आप या तो इसे बाहर एक फाइल करने के लिए लिखना चाहिए और उन्हें यह स्ट्रीम समाप्त होने पर (CGI::Application::Plugin::Stream का उपयोग करके यहां सहायता मिलती है, लेकिन आपको अभी भी इसे बाद में साफ करने की आवश्यकता होगी, लेकिन वास्तव में प्रत्येक वेब ऐप में एक अस्थायी निर्देशिका होनी चाहिए जो समय-समय पर साफ हो जाती है) या इसे बनाने के रूप में प्रिंट करें (जिसका अर्थ है एफएच STDIN इसके बजाय जो mod_perl या मई के तहत trickier हो सकता है नहीं होना)।

और फिर यह पूरा होने पर अपनी कार्यपुस्तिका को बंद करना याद रखें।

संबंधित मुद्दे

 संबंधित मुद्दे