从Java servlet下载文件为null

FMC

我正在尝试创建一种方法,该方法允许用户通过Servlet在文件系统上下载文件。现在,正确filename显示了下载内容并下载了文件,但文件内容始终为空。

我也尝试过将文件内容打印到控制台,但没有任何显示。

有人可以在这里建议我做错了什么吗?

谢谢

String filePath = "uploads/" + request.getParameter( "filename" );
File downloadFile = new File( filePath );

String relativePath = getServletContext().getRealPath( "" );
System.out.println( "relativePath = " + relativePath );

ServletContext context = getServletContext();

String mimeType = context.getMimeType( filePath );
if( mimeType == null )
{
    mimeType = "application/octet-stream";
}
System.out.println( "MIME type: " + mimeType );

response.setContentType( mimeType );
response.setContentLength( (int) downloadFile.length() );

String headerKey = "Content-Disposition";
String headerValue = String.format( "attachment; filename=\"%s\"", downloadFile.getName() );
response.setHeader( headerKey, headerValue );
byte[] bytes = Files.readAllBytes( downloadFile.getAbsoluteFile().toPath() );
OutputStream outStream = response.getOutputStream();

System.out.println( bytes.toString() );

outStream.write( bytes );

outStream.flush();
outStream.close();

注解

@WebServlet(urlPatterns =
{ "/Routing/*" })
@MultipartConfig(location = "/tmp", fileSizeThreshold = 1024 * 1024,     maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5)
public class Routing extends HttpServlet
{
布哈克·辛迪

此解决方案是BalusC File Servlet博客的改进解决方案

我用这个解决方案的原因是因为它reset()HttpServletResponse response写数据之前。

@WebServlet(urlPatterns =
{ "/Routing/*" })
@MultipartConfig(location = "/tmp", fileSizeThreshold = 1024 * 1024,     maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5)
public class FileServlet extends HttpServlet {

    // Constants ----------------------------------------------------------------------------------

    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.


    // Actions ------------------------------------------------------------------------------------

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        // Get requested file by path info.
        String filePath = "uploads/" + request.getParameter( "filename" );

        // Check if file is actually supplied to the request URI.
        if (filePath == null) {
            // Do your thing if the file is not supplied to the request URI.
            // Throw an exception, or send 404, or show default/warning page, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Decode the file name (might contain spaces and on) and prepare file object.
        File downloadFile = new File( filePath );

        // Check if file actually exists in filesystem.
        if (!downloadFile.exists()) {
            // Do your thing if the file appears to be non-existing.
            // Throw an exception, or send 404, or show default/warning page, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Get content type by filename.
        String contentType = getServletContext().getMimeType(file.getName());

        // If content type is unknown, then set the default value.
        // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp
        // To add new content types, add new mime-mapping entry in web.xml.
        if (contentType == null) {
            contentType = "application/octet-stream";
        }

        // Init servlet response.
        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");

        // Prepare streams.
        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            // Open streams.
            input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            // Write file contents to response.
            byte[] bytes = Files.readAllBytes( downloadFile.getAbsoluteFile().toPath() );
            output.write(buffer, 0, bytes.length);
        } finally {
            // Gently close streams.
            close(output);
            close(input);
        }
    }

    // Helpers (can be refactored to public utility class) ----------------------------------------

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it.
                e.printStackTrace();
            }
        }
    }
}

我希望这有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从servlet下载文件

来自分类Dev

使用Java从Sharepoint下载文件

来自分类Dev

如何使用Java Spark下载文件?

来自分类Dev

使用Java从MediaFire下载文件

来自分类Dev

在Java Servlet中创建并下载CSV文件

来自分类Dev

使用 Java Servlet 下载动态文件

来自分类Dev

在Java Servlet容器中获取上载文件夹

来自分类Dev

使用多线程在Java中下载文件

来自分类Dev

使用Java从服务器下载文件

来自分类Dev

从Java中的mega.co.nz下载文件

来自分类Dev

如何使用Java从Google Cloud Storage下载文件?

来自分类Dev

使用Java下载文件,没有api,奇怪的错误

来自分类Dev

如何从GCP桶使用Java下载文件夹?

来自分类Dev

Java-如何下载文件的非缓存版本?

来自分类Dev

如何使用Java处理失败的下载文件

来自分类Dev

从Java中的mega.co.nz下载文件

来自分类Dev

下载文件时出现问题(java)

来自分类Dev

使用多线程在Java中下载文件

来自分类Dev

Java FTP客户端未下载文件

来自分类Dev

vertx Java 下载文件名特殊字符

来自分类Dev

从 Artifactory 下载文件的 Java 代码不起作用

来自分类Dev

java.nio.file.NoSuchFileException - 从 GCS 下载文件

来自分类Dev

如何使用java从Gitlab帐户下载文件

来自分类Dev

Java文件下载未下载文件的确切副本

来自分类Dev

Java文件下载未下载文件的确切副本

来自分类Dev

Java连接到FTP服务器并使用Java默认库下载文件

来自分类Dev

使用webkitDirectory和Java Servlet在文件夹/子目录中上载文件

来自分类Dev

使用Java下载文件时如何获取原始文件名

来自分类Dev

如何使用Java REST服务和数据流下载文件