0

我需要在服务器上下文之外的目录中保存文件并下载文件。我正在使用Apache Tomacat 我可以在应用程序的 webapps 目录中的目录中执行此操作

如果我的目录结构如下,

--src
--WebContent
    -- uploaddir
         -- myfile.txt

然后我可以简单地下载。

      <a href="uploaddir/myfile.txt" target="_blank">download</a>

但是,问题是当文件在其他目录中时说d:\\uploadedfile\\myfile.txt

那么我将无法下载它,因为资源不在上面的服务器上下文中。

我有 uuid 映射的文件路径,例如,

d:\\uploadedfiles\\myfile.txt <-> some_uuid

然后我想下载文件,点击以下,

   <a href="filedownloadservlet?ref_file=some_uuid">download</a>

那么,当文件在服务器上下文之外时,如何使文件可下载,我听说过getResourceAsStream()可以做到这一点的方法,但是有人会帮助我如何做到这一点,可能是简单的代码片段吗?

4

3 回答 3

1

试试下面的代码,你可以在 filedownloadservet 中编写它。从请求参数中获取文件名,然后读写文件。

如果您需要进行一些安全检查,请在处理请求之前进行。

File file = new File("/home/files", "file name which user wants to download");

response.setContentType(getServletContext().getMimeType(file.getName()));
response.setContentLength(file.length());

BufferedInputStream inputStream = null;
BufferedOutputStream outputStream = null;

try {
    inputStream = new BufferedInputStream(new FileInputStream(file));
    outputStream = new BufferedOutputStream(response.getOutputStream());

    byte[] buf = new byte[2048];
    int len;
    while ((len = inputStream.read(buf)) > 0) {
        outputStream.write(buf, 0, len);
    }
} finally {
    if (outputStream != null) { 
        try {
            outputStream.close();
        } catch (IOException e) {
            //log it
        }
    }
    // do the same for input stream also
}
于 2013-04-18T05:30:45.793 回答
1

在这里我找到了答案,

 response.setContentType("application/msword");
 response.setHeader("Content-Disposition","attachment;filename=downloadname.doc");
 File file=new File("d:\\test.doc");
 InputStream is=new FileInputStream(file);
 int read=0;
 byte[] bytes = new byte[BYTES_DOWNLOAD];
 OutputStream os = response.getOutputStream();
 while((read = is.read(bytes))!= -1){
  os.write(bytes, 0, read);
 }
 os.flush();
 os.close();
于 2013-04-18T10:44:05.693 回答
0

基本路径不适用于 HTML,如果基本路径也被您的 Web 服务器公开,它看起来不像这里的情况。

要下载任意文件,您需要使用 FileInputStream 打开文件(并用缓冲的输入流包围它),读取一个字节,然后将该字节从您的 servlet 发送到客户端。

然后是安全问题,谷歌也应该这样做(基本上不授予访问任何文件的权限,而只授予要共享的文件,根据需要审核下载等。

再次在您的 servlet 中设置 mime 类型等,然后打开输入流并将字节写入输出流到客户端

于 2013-04-18T05:20:25.910 回答