下载CSV文件使用Spring MVC和OpenCSV jar

时间:2016-03-29 09:50:43

标签: spring-mvc

我试图在点击jsp中的“下载”按钮时下载.csv文件.jsp代码如下......

    <form:form method="POST" id="poCSVForm"
        action="downloadPoCsv" commandName="poCSVcmd" modelAttribute="poCSVcmd">

        <div class="content">
            <fieldset>
                <legend>Page Name</legend>
                <div>
                    <div class="contentpane">
                        <table>
                            <tr>
                                    <td><button type="submit" value="Download" id="downId" class="dwnldbtn">Download</button>
                                    <button type="button" class="exit smallbtn" value="Exit">Exit</button></td>
                            </tr>

                        </table>
                    </div>
                </div>
            </fieldset>
        </div>
    </form:form>

然后我的控制器代码就像这样......

@RequestMapping(value = "/downloadPoCsv", method = RequestMethod.POST)
public void doPoCsvDownload(
        @ModelAttribute("poCSVcmd") PurchaseOrderCSVBean poCsvBean,
        Map<String, Object> model, HttpServletRequest req,HttpServletResponse response) throws IOException {
     CSVWriter writer = null;
     String filepath = null;
    try {

        HttpSession session = req.getSession();
        Session hsession = (Session) session
                .getAttribute(MOLConstants.HIBERNATE_SESSION_KEY);
        filepath = "purchaseOrder" + new Date().getTime() + ".csv";

        ServletContext context = req.getServletContext();
        String realPath = context.getRealPath("");
        System.out.println("appPath = " + realPath);
        // construct the complete absolute path of the file
        String fullPath = realPath + "\\stuff\\" + filepath;

        System.out.println("fullPath = " + fullPath);

        File downloadFile = new File(realPath);
        try {
            if (!downloadFile.exists()) {
                if (downloadFile.mkdir()) {
                } else {
                    throw new RuntimeException("Could not create directory");
                }
            }
        } catch (Exception e) {
            throw new RuntimeException();
        }           

        String mimeType = context.getMimeType(fullPath);   // get MIME type of the file
        if (mimeType == null) {

        mimeType = "application/octet-stream";  // set to binary type if MIME mapping not found
        }
        System.out.println("MIME type: " + mimeType);

        // set content attributes for the response
        response.setContentType(mimeType);
        response.setContentLength((int) downloadFile.length());

        // set headers for the response
        String headerKey = "Content-Disposition";
        String headerValue = String.format("attachment; filename=\"%s\"",downloadFile.getName());
        response.setHeader(headerKey, headerValue);

        List<PoCsvUploadView> csvDataList = poService.getPoCsvData(poCsvBean.getExp_ind(),poCsvBean.getStdt(),poCsvBean.getEnddt());

        FileWriter fwriter = new FileWriter(fullPath);
        writer = new CSVWriter(fwriter, ',', CSVWriter.NO_QUOTE_CHARACTER);

        String[] header = new String[31];

        header[0] = "COMPANY_CD";
        .......
        header[30] = "VENDOR_TYPE";

        List<String[]> li = new ArrayList<String[]>();
        li.add(header);

        for (PoCsvUploadView group : csvDataList)
        {
            String[] arr = new String[31];

            arr[0] = group.getCompany_cd();
            .....
            arr[30] = group.getVendor_type();
            li.add(arr);

        }
        writer.writeAll(li);

    } catch (Exception e) {
        e.printStackTrace();
        logger.error("Exception >> ", e);
        throw new CustomGenericException(
                "Error occured while loading report!!");
    }finally{
        writer.flush();
        writer.close();
    }
}

现在当我点击下载按钮时,csv文件将在特定位置生成,即在fullPath变量上生成。但是该文件没有通过浏览器下载,而是浏览器正在下载一些名为downloadPoCsv的文件(这与我的控制器方法中的@RequestMapping完全相同),这是不可取的。你们能为此提供一些帮助吗? Thanx提前。是的,我正在使用OpenCsv jar。

1 个答案:

答案 0 :(得分:0)

要清楚这里的问题是spring MVC而不是openCSV,因为您的问题描述是您正在尝试下载文件并且正在下载具有不同名称的文件。

CodeJava有一个pretty good example of a Spring MVC download。试一试。