via txt imagen descargar con archivos archivo abrir java javascript jquery ajax liferay

java - txt - descargar imagen con ajax



Cómo descargar un archivo desde una solicitud AJAX en el método serveResource de Liferay(-,-) (5)

Creo que es solo tu comando ajax que no cumple con los requisitos. Consulte la documentación de jquery ajax.

Parece que ajax jquery se queja de la descarga de datos xml, pero no es en consecuencia con el formato de datos excel.

Establezca dataType en "texto" en ajax y haga un buen tipo MIME antes de enviar el archivo generado al cliente. De este modo, la descarga del archivo de Excel debe ser interpretada por el navegador como un archivo de Excel real.

Tengo un requisito como: Estoy haciendo una solicitud AJAX para pasar algunos datos al servidor. En mi servidor estoy creando un archivo usando esos datos.

"Ahora el problema es que el archivo no se descarga al lado del cliente".

(Estoy usando Apache POI API para crear un archivo de Excel a partir de los datos dados). ¿Puede alguien ayudarme a hacer esto?

Aquí está mi código:

(Código para realizar solicitud 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>

Java código serveResource (-, -) método

/* * 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); } } }

/ * ImportBulkDataUtil.downloadUploaded (-, -, -) método para crear archivos de 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"); } }

Alguien puede ayudarme ?


Podría haber 2 problemas. O bien no envía ningún archivo o ajax no lo está descargando.

Desde su código puedo ver que está escribiendo un archivo en el flujo de salida de la respuesta, así que sospecho que la parte está funcionando. Quizás pueda abrir la herramienta de desarrollo del navegador para ver la respuesta del servidor si contiene datos en el cuerpo de la respuesta .

La segunda parte es complicada porque de la naturaleza de JS (motivo de seguridad) no se puede descargar directamente en JS (la descarga no se iniciará por sí misma)

Debe utilizar iframe y adjuntar url de archivo y enviar formulario para iniciar la descarga

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

o

puede usar el nuevo FileAPI HTML5 HTML5 para hacer esto por usted en una sola solicitud. Simplemente especifique el tipo de blob ( responseType: ''blob'' ) para la respuesta, convierta la URL del cuerpo de la respuesta, agréguelo al atributo href del elemento del ancla <a> recién creado y haga clic en él.

Vea this publicación para más detalles.

Espero que ayude.


Puede escribir el contenido del POS HSSFWorkbook en un ByteArrayOutputStream y luego usar el método toByteArray () del flujo en el método PortletResponseUtil sendFile () de Liferay de la siguiente manera:

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

En lugar de escribir directamente en el resourceResponse.

Sin embargo, probablemente por razones de seguridad, (Javascript no puede escribir directamente los archivos en un cliente) no puede hacerlo a través de Ajax.

Como alternativa, puede guardar los datos sin procesar que calcule en su código JS a una entrada oculta y pasarlos al servidor a través de un formulario de envío regular.


Simplemente llame a la siguiente función con parámetros:

url - donde desea solicitar un archivo
datos - en caso de que quieras enviar algunos datos
pageIndex - div id donde desea agregar iframe y que se eliminará sin #.

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(); }


solo tiene la solicitud como GET, devuelva el bytestream del archivo en respuesta y establezca los encabezados correspondientes (dependiendo del formato de su archivo excel / pdf) y luego, en el lado del cliente, simplemente abra la respuesta en una nueva pestaña, el navegador iniciará la descarga del archivo .