我在服务器端有一个Struts2动作用于文件下载.
<action name="download" class="com.xxx.DownAction">
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="inputName">imageStream</param>
<param name="contentDisposition">attachment;filename={fileName}</param>
<param name="bufferSize">1024</param>
</result>
</action>
Run Code Online (Sandbox Code Playgroud)
但是当我使用jQuery调用动作时:
$.post(
"/download.action",{
para1:value1,
para2:value2
....
},function(data){
console.info(data);
}
);
Run Code Online (Sandbox Code Playgroud)
在Firebug中我看到使用二进制流检索数据.我想知道如何打开用户可以在本地保存文件的文件下载窗口?
最近我在一个需要比以前更多的IO交互的项目上工作,我觉得我想要查看常规库(特别是Commons IO)并解决更深入的IO问题.
作为学术测试,我决定实现一个基本的,多线程的HTTP下载器.这个想法很简单:提供一个下载URL,代码将下载该文件.为了提高下载速度,文件被分块并且每个块同时下载(使用HTTP Range: bytes=x-x头)以使用尽可能多的带宽.
我有一个工作原型,但你可能已经猜到了,它并不完全理想.目前我手动启动3个"下载程序"线程,每个线程下载文件的1/3.这些线程使用通用的同步"文件编写器"实例来实际将文件写入磁盘.完成所有线程后,"文件编写器"完成,任何打开的流都关闭.一些代码片段可以给你一个想法:
线程启动:
ExecutorService downloadExecutor = Executors.newFixedThreadPool(3);
...
downloadExecutor.execute(new Downloader(fileWriter, download, start1, end1));
downloadExecutor.execute(new Downloader(fileWriter, download, start2, end2));
downloadExecutor.execute(new Downloader(fileWriter, download, start3, end3));
Run Code Online (Sandbox Code Playgroud)
每个"下载程序"线程下载一个块(缓冲)并使用"文件编写器"写入磁盘:
int bytesRead = 0;
byte[] buffer = new byte[1024*1024];
InputStream inStream = entity.getContent();
long seekOffset = chunkStart;
while ((bytesRead = inStream.read(buffer)) != -1)
{
fileWriter.write(buffer, bytesRead, seekOffset);
seekOffset += bytesRead;
}
Run Code Online (Sandbox Code Playgroud)
"文件写入器"使用RandomAccessFileto seek()和write()磁盘块写入磁盘:
public synchronized void write(byte[] bytes, int len, long start) throws IOException
{
output.seek(start); …Run Code Online (Sandbox Code Playgroud) 我的应用程序的当前体系结构不允许我在服务器端存储文件并创建指向该存储文件的链接.那么有没有其他选项(或代码片段)直接流ZipFile并将其存储在客户端?
编辑:我想我的问题被误解了.我收到压缩文件的答案并将其存储在客户端.我已经实现了这一点.以下是示例用例的主要关注点:
场景:用户有大约5000条记录(每条大约1 MB),用户希望下载以ZIP格式压缩的每5000条记录的子记录(CSV格式).所有CSV文件都是即时生成的.
方法:由于ZIP文件的大小可以达到5 GB,因此我采用直接将文件内容流式传输到客户端创建的ZIP文件的方法.我已经使用了PipeInputStream和PipeOutputStream.
结果:由于我是vaadin的新手,我在上述方法中没有成功,因此寻找支持将ZIP文件(无论大小可能是直接)流式传输到客户端的任何建议/代码片段.
我想我现在很清楚.
java ×2
ajax ×1
download ×1
http ×1
io ×1
javascript ×1
jquery ×1
jsp ×1
performance ×1
vaadin ×1