Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用内容配置下载文件时出现问题_Java_Servlets_Content Disposition - Fatal编程技术网

Java 使用内容配置下载文件时出现问题

Java 使用内容配置下载文件时出现问题,java,servlets,content-disposition,Java,Servlets,Content Disposition,在开始下载文件之前,我希望我的程序有一个弹出的另存为窗口选项,但是当我运行servlet时,它会自动开始下载文件。我错过了什么 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream outputStream = response.getOutputStream();

在开始下载文件之前,我希望我的程序有一个弹出的另存为窗口选项,但是当我运行servlet时,它会自动开始下载文件。我错过了什么

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletOutputStream outputStream = response.getOutputStream();
    FileInputStream fis=new FileInputStream("E:/sound.mp3");
    response.setContentLength(fis.available());
    response.setContentType("audio/basic");
    response.addHeader("content-disposition", "attachment;filename=abc.mp3");
    while(true){
        int read = fis.read();
        if(read==-1)break;
        outputStream.write(read);
    }
    fis.close();        
}

您必须手动实现该对话框,例如()。用户选择文件后,您将能够启动http请求下载(到您的servlet)并将文件保存到所需路径。

尝试查看以下内容:


取出代码中的main语句,并运行(newfilechoosertest(),250110)在您自己的代码中。如果我这样做,我会做一个名为
saveStatus
的整数和3个等于0、1和2名为
waiting
save
cancel
的期末考试。然后,我会在您的其他编程中执行一个while循环,以查看
saveStatus
是否等于
waiting
以暂停您的程序(而不是对话框)。之后,我会做一个if语句,看看
saveStatus
是否等于
save
。如果是,请下载,如果不是,请不要下载。就这么简单。

您的程序不是桌面/独立的,因为它是一个在服务器上运行的servlet。当您在Eclipse中通过右键单击并
runas
->
runonserver
运行它时,Eclipse实际上会打开一个网页来显示结果。因此,您的程序现在是一个Web应用程序,Eclipse(或它打开的页面)是客户端。客户端正在保存您发送的信息,而不是您的程序。明白了吗

content-disposition
标题仅用于建议下载的文件名。浏览器设置定义是否打开另存为窗口。你无法控制

例如,在Google Chrome中,在
设置
/
高级设置
/
下载
中,有一个选项
在下载前询问每个文件的保存位置
。只有选择此选项,它才会打开所需的对话框。否则,它将保存在默认位置(也在浏览器设置中定义)。所有浏览器都有类似的选项

还请注意,根据
内容类型
标题,浏览器将尝试显示内容,而不是下载内容。例如,浏览器将尝试显示文本和html。但是,您可以通过将标题设置为不可显示的类型来强制下载:

response.setContentType(“应用程序/八位字节流”)


如果您不想创建Web应用程序:由于您的程序在服务器上运行,它只需发送信息即可完成。由客户程序决定如何处理它。在本例中,客户端是一个浏览器(或者Eclipse打开浏览器页面)。诸如
内容处置
标题之类的标题是针对浏览器的。如果您要创建自己的客户端(Swing客户端、Android应用程序、iPhone应用程序),而不是浏览器,那么客户端将从服务器接收信息并决定如何处理(显示或以任何方式保存),甚至忽略HTTP头

您的问题是Mime类型。某些类型(特别是已知特定处理程序的类型)将由大多数浏览器直接下载。使用application/binary确实有点帮助,但即使这样,一些浏览器也可能被配置为下载它或解释处置处理程序中的文件扩展名


我认为大多数解决方案在下载链接之前的页面上使用javascript。

我认为这是在服务器端。您正在尝试将服务器事件传播到客户端。请看:和Regards@DaniloMu尼奥斯:据我所知,有两种情况与我的不同……但谢谢你的支持concern@HelloWorld提供其他信息,如如何访问
servlet
以及在何处运行servlet@shekharsuman那不是复制品选项