【问题标题】:Java Servlet Downloading FileJava Servlet 下载文件
【发布时间】:2013-05-04 13:37:45
【问题描述】:

所以我有两个文件,servlet:

package com.servlets;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;

import com.java.DataDownloader;

/**
 * Servlet implementation class downloaderServ
 */
public class DownloaderServ extends HttpServlet {
    private static final long serialVersionUID = 1L;
    DataDownloader dl;
/**
 * @see HttpServlet#HttpServlet()
 */
public DownloaderServ() {
    super();
    dl = new DataDownloader();
    // TODO Auto-generated constructor stub
}

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            dl.download();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
    }

}

进行处理的应用程序:

package com.java;
import java.io.*;
import java.net.*;
import org.apache.commons.io.*;

public class DataDownloader {

private static boolean get(String address, String fileName) {
    try {
            URL url = new URL(address);
            File f = new File(fileName);
            FileUtils.copyURLToFile(url, f);
    }
    catch(MalformedURLException e) {
            System.out.println(e);
            return false;
    }
    catch(IOException e) {
            System.out.println(e);
            return false;
    }

    return true;
}

public boolean download() {

    String[][] urls = new String[3][2];

    urls[0][0] = "http://data.london.gov.uk/datafiles/crime-community-safety/mps-recordedcrime-borough.csv";
    urls[0][1] = "crimes.csv";
    urls[1][0] = "http://data.london.gov.uk/datafiles/housing/average-house-prices-borough.xls";
    urls[1][1] = "prices.xls";
    urls[2][0] = "http://data.london.gov.uk/datastorefiles/datafiles/demographics/gla_2012rnd_SHLAA_based_borough_projections.xls";
    urls[2][1] = "population.xls";

    for (int i = 0; i < 3; i++) {
            if (get(urls[i][0], urls[i][1]) == false) {
                    System.out.println(false);
                    return false;
            }
    }
    return true;
}

}

我可以毫无问题地运行它,但似乎没有下载任何文件。我还打印了返回值(true 或 false),它确实打印了 true。下载文件没有这么简单吗?

【问题讨论】:

  • 您希望这段代码能做什么?你希望它在客户端机器上下载这三个文件吗?
  • 不,文件将被下载到服务器。

标签: java file download fileutils


【解决方案1】:

代码看起来不错,所以如果打印 true 并且您在运行程序时也没有看到任何异常,那么您的问题是您无法找到从 url 复制的文件。

由于目标File 中没有指定目录,因此它必须将您的文件转储到您正在调用java 程序的文件夹中。如果它是运行程序的 IDE (Eclipse) 等,请刷新并检查关联的项目文件夹。

【讨论】:

  • 我试过了,但没有文件。网络活动确实表明正在下载文件,但无处可见。
  • 你是如何运行这个程序的,通过调用java 命令或通过一些IDE?
【解决方案2】:

Kevin,你显然没有遇到任何异常,我的建议是:请右键单击你的 Eclipse 项目根文件夹,然后单击:Refresh。您的文件将直接位于该路径。

另外,我正在从您的问题中删除 servlet 标记,因为该问题与 servlet 完全无关。只是您在 servlet 中使用它们,但同样的代码可以单独工作,甚至在 Java EE 之外也是如此。

我添加了 fileutils。

【讨论】:

  • 我试过了,但没有文件。网络活动确实表明正在下载文件,但无处可见。
  • 不要只指定文件名,而是尝试使用绝对路径。
【解决方案3】:

我更改了它,因此采用了绝对路径,例如

File f = new File("C:\\data\\" + fileName);

这行得通。将它放在 servlet 中是否会改变它,因此需要绝对路径并使相对路径不可用?我在 servlet 之外测试了下载部分,它适用于相对路径,或者如果没有指定,它只是下载到项目文件夹中。

【讨论】:

  • 可能是的,有时间我自己试试看。原因可能是,当您通过 servlet 等 Web 组件运行代码时,调用由 Web 容器管理,它根据与上下文根的关系而不是绝对文件系统路径来解释路径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多