2015-03-19 6 views
22

में AJAX अनुरोध से फ़ाइल डाउनलोड करने के लिए कैसे करें मुझे इसकी आवश्यकता है: मैं सर्वर पर कुछ डेटा पास करने के लिए AJAX अनुरोध कर रहा हूं। मेरे सर्वर में मैं उस डेटा का उपयोग कर एक फाइल बना रहा हूं।Liferay ServResource (-, -) विधि

"अब समस्या यह है कि फ़ाइल क्लाइंट-साइड पर डाउनलोड नहीं हो रही है"।

(मैं दिए गए डेटा से एक्सेल फ़ाइल बनाने के लिए अपाचे पीओआई एपीआई का उपयोग कर रहा हूं)। क्या कोई मुझे ऐसा करने में मदद करेगा?

यहाँ मेरी कोड है: (-, -)

(कोड AJAX अनुरोध करने के लिए)

<script> 
    function downloadUploadedBacklogs() { 

     try { 
      var table_data = []; 

      var count = jQuery("#backlogTable tr:first td").length; 
      jQuery("#<portlet:namespace/>noOfColumns").val(count); 
      var index = 0; 
      jQuery('tr').each(function(){ 

       var row_data = ''; 
       jQuery('td', this).each(function(){ 
        row_data += jQuery(this).text() + '='; 
       }); 
       table_data.push(row_data+";"); 

      }); 
      jQuery("#<portlet:namespace/>backlogDataForDownload").val(table_data); 
      jQuery("#<portlet:namespace/>cmd").val("downloadUploadedBacklogs"); 
      alert('cmd: ' + jQuery("#<portlet:namespace/>cmd").val()); 
      var formData = jQuery('#<portlet:namespace/>backlogImportForm').serialize(); 

      jQuery.ajax({ 
       url:'<%=resourceURL%>', 
       data:formData, 
       type: "post", 
       success: function(data) { 

       } 
      }); 
      alert('form submitted'); 

     } catch(e) { 
      alert('eroor: ' + e); 
     } 
    }; 
</script> 

जावा कोड serveResource विधि

/* 
* serveResource(-, -) method to process the client request 
*/ 
public void serveResource(ResourceRequest resourceRequest, 
      ResourceResponse resourceResponse) throws IOException, 
      PortletException { 


     String cmd = ParamUtil.getString(resourceRequest,"cmd"); 
     System.out.println("**********************cmd*************"+cmd); 

     if(cmd!="") { 
      if("downloadUploadedBacklogs".equalsIgnoreCase(cmd)){ 

       String backlogData = ParamUtil.getString(resourceRequest, "backlogDataForDownload"); 
       ImportBulkDataUtil.downloadUploaded("Backlogs", resourceRequest,resourceResponse); 
      } 
     } 
} 
(-, -, -) Excel फ़ाइल /

public static void downloadUploaded(String schema, ResourceRequest resourceRequest,ResourceResponse resourceResponse) { 

     String excelSheetName = ParamUtil.getString(resourceRequest,"excelSheetName"); 

     try { 
      resourceResponse.setContentType("application/vnd.ms-excel"); 
      resourceResponse.addProperty(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+excelSheetName+"_Template.xls"); 

      OutputStream outputStream=resourceResponse.getPortletOutputStream(); 
      //converting the POI object as excel readble object 
      HSSFWorkbook objHSSFWorkbook=new HSSFWorkbook(); 
      HSSFSheet objHSSFSheet=objHSSFWorkbook.createSheet(excelSheetName+"_Template"); 

      //set the name of the workbook 
      Name name=objHSSFWorkbook.createName(); 
      name.setNameName(excelSheetName+"_Template"); 

      objHSSFSheet.autoSizeColumn((short)2); 

      // create freeze pane (locking) top row 
      objHSSFSheet.createFreezePane(0, 1); 

      // Setting column width 
      String excelData = StringPool.BLANK; 
      if((schema.equalsIgnoreCase("Backlogs"))){ 
       System.out.println("Inside BacklogsCreation.........."); 
       objHSSFSheet.setColumnWidth(0, 10000); 
       objHSSFSheet.setColumnWidth(1, 7000); 
       objHSSFSheet.setColumnWidth(2, 7000); 
       objHSSFSheet.setColumnWidth(3, 7000); 
       objHSSFSheet.setColumnWidth(4, 7000); 
       objHSSFSheet.setColumnWidth(5, 5000); 
       objHSSFSheet.setColumnWidth(6, 5000); 
       objHSSFSheet.setColumnWidth(7, 7000); 
       objHSSFSheet.setColumnWidth(8, 7000); 
       excelData = ParamUtil.getString(resourceRequest,"backlogDataForDownload"); 
      } 
      System.out.println("downloadUploaded excelTableData: " + excelData); 

      // Header creation logic 

      HSSFRow objHSSFRowHeader = objHSSFSheet.createRow(0); 
      objHSSFRowHeader.setHeightInPoints((2*objHSSFSheet.getDefaultRowHeightInPoints())); 
      CellStyle objHssfCellStyleHeader = objHSSFWorkbook.createCellStyle(); 
      objHssfCellStyleHeader.setFillBackgroundColor((short)135); 
      objHssfCellStyleHeader.setAlignment(objHssfCellStyleHeader.ALIGN_CENTER); 
      objHssfCellStyleHeader.setWrapText(true); 

      // Apply font styles to cell styles 
      HSSFFont objHssfFontHeader = objHSSFWorkbook.createFont(); 
      objHssfFontHeader.setFontName("Arial"); 
      objHssfFontHeader.setColor(HSSFColor.WHITE.index); 

      HSSFColor lightGrayHeader = setColor(objHSSFWorkbook,(byte) 0x00, (byte)0x20,(byte) 0x60); 
      objHssfCellStyleHeader.setFillForegroundColor(lightGrayHeader.getIndex()); 
      objHssfCellStyleHeader.setFillPattern(CellStyle.SOLID_FOREGROUND); 

      objHssfFontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
      objHssfFontHeader.setFontHeightInPoints((short)12); 
      objHssfCellStyleHeader.setFont(objHssfFontHeader); 
      objHssfCellStyleHeader.setWrapText(true); 

      // first column about Backlog title 
      HSSFCell objBacklogTitleCell = objHSSFRowHeader.createCell(0); 
      objBacklogTitleCell.setCellValue("Backlog"); 
      objBacklogTitleCell.setCellStyle(objHssfCellStyleHeader); 

      // second column about Description 
      HSSFCell objBacklogDescCell = objHSSFRowHeader.createCell(1); 
      objBacklogDescCell.setCellValue("Description"); 
      objBacklogDescCell.setCellStyle(objHssfCellStyleHeader); 

      // third column about Project 
      HSSFCell objProjectNameCell = objHSSFRowHeader.createCell(2); 
      objProjectNameCell.setCellValue("Project"); 
      objProjectNameCell.setCellStyle(objHssfCellStyleHeader); 
      setComment("Project which the backlog belongs to", objProjectNameCell); 

      // fourth column about Category 
      HSSFCell objCategoryNameCell = objHSSFRowHeader.createCell(3); 
      objCategoryNameCell.setCellValue("Category"); 
      objCategoryNameCell.setCellStyle(objHssfCellStyleHeader); 
      setComment("Category which the backlog belongs to (i.e. Bug, New Requirement, Enhancement)", objCategoryNameCell); 

      // fifth column about Group 
      HSSFCell objGroupNameCell = objHSSFRowHeader.createCell(4); 
      objGroupNameCell.setCellValue("Group"); 
      objGroupNameCell.setCellStyle(objHssfCellStyleHeader); 
      setComment("Group which the backlog belongs to", objGroupNameCell); 

      // sixth column about Est. Start Date 
      HSSFCell objEstStartDtCell = objHSSFRowHeader.createCell(5); 
      objEstStartDtCell.setCellValue("Est. Start Date"); 
      objEstStartDtCell.setCellStyle(objHssfCellStyleHeader); 
      setComment("Date Format: dd/mm/yyyy", objEstStartDtCell); 

      // seventh column about Est. End Date 
      HSSFCell objEstEndDtCell = objHSSFRowHeader.createCell(6); 
      objEstEndDtCell.setCellValue("Est. End Date"); 
      objEstEndDtCell.setCellStyle(objHssfCellStyleHeader); 
      setComment("Date Format: dd/mm/yyyy", objEstEndDtCell); 

      // fifth column about Group 
      HSSFCell objStatusCell = objHSSFRowHeader.createCell(7); 
      objStatusCell.setCellValue("Status"); 
      objStatusCell.setCellStyle(objHssfCellStyleHeader); 

      String excelTableDataRecords[] = excelData.split(";"); 
      for(int i=1; i<excelTableDataRecords.length; i++) { 

       HSSFRow objHSSFRow = objHSSFSheet.createRow(i); 
       objHSSFRow.setHeightInPoints((2*objHSSFSheet.getDefaultRowHeightInPoints())); 

       excelTableDataRecords[i] = excelTableDataRecords[i].substring(0, (excelTableDataRecords[i].length()-2)); 
       if(excelTableDataRecords[i].charAt(0) == ',') { 
        excelTableDataRecords[i] = excelTableDataRecords[i].substring(1, (excelTableDataRecords[i].length())); 
       } 
       String excelTableColumns[] = excelTableDataRecords[i].split("::"); 

       for(int j=0; j<excelTableColumns.length; j++) { 

         // Apply font styles to cell styles 
         HSSFFont objHssfFont = objHSSFWorkbook.createFont(); 
         objHssfFont.setFontName("Arial"); 
         CellStyle objHssfCellStyle = objHSSFWorkbook.createCellStyle(); 
         objHssfFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); 
         objHssfFont.setColor(HSSFColor.BLACK.index); 
         objHssfFont.setFontHeightInPoints((short)10); 

         objHssfCellStyle.setWrapText(true); 
         objHssfCellStyle.setFont(objHssfFont); 
         // other column about Backlog title 
         HSSFCell objNewHSSFCellFirstNameAdd = objHSSFRow.createCell(j); 
         objNewHSSFCellFirstNameAdd.setCellValue(excelTableColumns[j]); 
         objNewHSSFCellFirstNameAdd.setCellStyle(objHssfCellStyle); 
       } 
      } 

      objHSSFWorkbook.write(outputStream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("Exception raised in downloadUploaded() method to download uploaded excel data"); 
     } 
    } 

किसी को भी मेरी मदद कर सकते बनाने के लिए विधि

/ * ImportBulkDataUtil.downloadUploaded ?

PortletResponseUtil.sendFile(resourceRequest, resourceResponse, "FILENAME", byteStream.toByteArray(), "CONTENT_TYPE"); 

के लिए सीधे लिखने की बजाय:

+0

** [कृपया इस संदर्भ लें: जावा सर्वलेट फ़ाइल डाउनलोड उदाहरण] (http://www.codejava.net/java-ee/servlet/java-servlet-download-file-example) ** –

+0

मैंने संसाधन URL के साथ भी कोशिश की। लेकिन चूंकि मेरा डेटा गतिशील रूप से बदल रहा है इसलिए मुझे resourceURL param मान को अपडेट करने की आवश्यकता है। लेकिन जब मैं इसे केवल आंशिक डेटा से अपडेट कर रहा हूं, तो मेरी सेवा पर जा रहा है संसाधन (-, -) विधि –

+0

और संसाधन URL के साथ पहचान की गई एक और समस्या यूआरएल में कुछ लंबाई सीमा है। इसलिए डेटा बहुत बड़ा होने पर समस्या होगी .. –

उत्तर

2

आप POI HSSFWorkbook की सामग्री को एक ByteArrayOutputStream लिए विधि इस प्रकार लिख सकते हैं और उसके बाद Liferay के PortletResponseUtil Sendfile (में धारा की विधि toByteArray() का उपयोग कर सकते हैं) संसाधन रिस्पॉन्स।

हालांकि, सुरक्षा कारणों से, (जावास्क्रिप्ट सीधे क्लाइंट को फाइल नहीं लिख सकता) आप अजाक्स के माध्यम से ऐसा नहीं कर सकते हैं।

आप वैकल्पिक रूप से कच्चे डेटा को सहेज सकते हैं जिसे आप अपने जेएस कोड में एक छिपे हुए इनपुट में गणना करते हैं और नियमित रूप से जमा करने के माध्यम से सर्वर को पास करते हैं।

+0

हाय ट्रायफ़ोन, आपके उत्तर के लिए धन्यवाद .. मैं इसे आज़माउंगा और आपको स्थिति –

+0

की स्थिति बता दूंगा, लेकिन मैंने इसे हल नहीं किया समस्या): बाइटएरेयूऑटपुटस्ट्रीम byteArrOStream = नया ByteArrayOutputStream(); objHSSFWorkbook.write (byteArrOStream); PortletResponseUtil.sendFile (resourceRequest, resourceResponse, excelSheetName + "_ Template.xls", byteArrOStream.toByteArray(), "application/vnd.ms-excel"); क्या आप आगे की जरूरतों पर अधिक रोशनी डाल सकते हैं ...? –

2

बस जीईटी के रूप में अनुरोध है, प्रतिक्रिया में फ़ाइल के बाइटस्ट्रीम को वापस करें और उसके अनुसार हेडर सेट करें (फ़ाइल एक्सेल/पीडीएफ के प्रारूप के आधार पर) और उसके बाद क्लाइंट साइड पर केवल नए टैब में प्रतिक्रिया खोलें फ़ाइल डाउनलोड शुरू करें।

+0

मैंने कोई दृष्टिकोण नहीं देखा, क्या आप इसका नमूना संदर्भ –

2

मुझे लगता है कि यह सिर्फ आपका AJAX कमांड है जिसका आवश्यकताएं पालन नहीं करते हैं। jquery AJAX दस्तावेज़ देखें।

ऐसा लगता है कि AJAX jquery xml डेटा डाउनलोड शिकायत करता है लेकिन यह एक्सेल डेटा प्रारूप के अनुसार नहीं है।

डेटा टाइप करें AJAX में "टेक्स्ट" टाइप करें और जेनरेट फ़ाइल को क्लाइंट को भेजने के लिए पहले अच्छा एमआईएम प्रकार करता है .. यह एक्सेल फ़ाइल डाउनलोड को वास्तविक एक्सेल फ़ाइल के रूप में ब्राउज़र द्वारा व्याख्या करने के लिए बनाता है।

7

2 समस्याएं हो सकती हैं। या तो आप बिल्कुल फाइल नहीं भेजते हैं या AJAX इसे डाउनलोड नहीं कर रहा है।

अपने कोड से मैं देख सकता हूं कि आप प्रतिक्रिया के आउटपुट स्ट्रीम में फ़ाइल लिख रहे हैं, इसलिए मुझे संदेह है कि यह हिस्सा काम कर रहा है। हो सकता है कि आप सर्वर से प्रतिक्रिया देखने के लिए ब्राउज़र डेवलपर टूल खोल सकें यदि इसमें response body में डेटा है।

दूसरा भाग जटिल है क्योंकि जेएस (सुरक्षा कारण) की प्रकृति से आप सीधे जेएस में डाउनलोड नहीं कर सकते हैं (डाउनलोड स्वयं शुरू नहीं होगा)।

आप या तो आइफ्रेम का उपयोग करें और में फ़ाइल यूआरएल संलग्न करें और प्रपत्र प्रस्तुत करने के लिए डाउनलोड शुरू करने की जरूरत है

$("body").append("<iframe src='" + data.message + "' style='display: none;' ></iframe>"); 

या

आप नए HTML5 FileAPI उपयोग कर सकते हैं एक अनुरोध में आप के लिए यह करने के लिए। बस blob (responseType: 'blob') प्रतिक्रिया के लिए टाइप करें, प्रतिक्रिया निकाय से यूआरएल कन्वर्ट करें, इसे नव निर्मित एंकर <a> तत्व के href विशेषता में संलग्न करें और उस पर क्लिक करें।

अधिक जानकारी के लिए this पोस्ट देखें।

उम्मीद है कि मदद करता है।

+0

प्रदान कर सकते हैं, आपके सुझाव के लिए धन्यवाद, मैं आपको कोशिश करूंगा और आपको –

+0

बताऊंगा। हम फ़ाइलएपीआई का उपयोग कर रहे हैं ताकि आप एकल अनुरोध में फ़ाइल डाउनलोड कर सकें जहां आपको आवश्यकता हो कहीं फ़ाइल पकड़ो और बस इसे यूआरएल भेजें और इसे डाउनलोड करने के लिए एक और अनुरोध करें। – Mior

1

बस मानकों के साथ निम्न फ़ंक्शन को कॉल करें: - जहां आप फ़ाइल
डेटा के लिए अनुरोध करना चाहते हैं -

यूआरएल को बैठाना आप चाहते हैं कुछ डेटा
pageIndex भेजें - div id जहां यू आइफ्रेम संलग्न करना चाहते हैं और इससे # के बिना हटा दिया जाएगा।

this.ajaxDownload = function(url, data,pageId) { 
       pageId = '#' + pageId; 
       if ($(pageId + ' #download_iframe').length == 0) { 
        $("<iframe id='download_iframe' style='display: none' src='about:blank'></iframe>").appendTo(pageId); 
       } 

       var input = "<input type='hidden' name='requestJson' value='" + JSON.stringify(data) + "'>"; 

       var iframe_html = "<html>"+ 
        "<head>"+ 
        "</head>"+ 
        "<body>"+ 
        "<form id='downloadForm' method='POST' action='" + url +"'>" +input+ "</form>" + 
        "</body>"+ 
        "</html>"; 

       var ifrm = $(pageId + ' #download_iframe')[0].contentWindow.document; 
       ifrm.open(); 
       ifrm.write(iframe_html); 
       ifrm.close(); 

       $(pageId + ' #download_iframe').contents().find("#downloadForm").submit(); 
} 
+0

मुझे अपवाद मिल रहा है: contentWindow अपरिभाषित, ifrm.open(); // –

+0

खोलने में असमर्थ @ कंधनप्रकाशशर्मा आप पेज नहीं भेज रहे हैं, इसे सही आईडी भेजने के लिए सही प्रयास करें।आप यह सुनिश्चित कर सकते हैं कि आपका पृष्ठ आईडी डिबगिंग कोड द्वारा अच्छी तरह से काम कर रहा है, अगर स्थिति जहां हम लंबाई की जांच करते हैं तो शून्य के बराबर है – KlwntSingh

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