http://www.csdn.net/develop/read_article.asp?id=19064
解决方案 »
- 263通信 明天面试有以前面过的同学吗?分享一下经验啊!!!
- 关于“org.apache.commons.dbcp.SQLNestedException:”
- 关于把数据库的数据生成word文档,都不知道怎么弄,头痛死
- 请大家帮帮我,从数据库中直接读图片显示到页面,后台数据和前台页面不同步的问题.
- 求助!!!!!!!!!!!jsp+Tomcat+sql server 2000在线考试系统的实现
- B/S架构编程该用哪些工具,在线等....
- 神奇问题:请高手指教!!
- run time
- RSa.getString的中文显示问题(在线给分)
- 奇怪问题,SpringBoot的HelloWorld在Win7下不能用,在Ubuntu下可以
- 我想我编写的程序有发送短信的功能~(分不够再加)
- 在JSP中如何将从数据库中取出的文章按照原来的段落显示?
里面的下载程序我试了一下没有成功。
我将下面的链接直接拖拽的网络蚂蚁里面,网络蚂蚁报错,说无效网络连接。
<a href="./fileDownload.jsp">文件下载</a>
// 一下是fileDownload.jsp文件内容<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%
String fileName = "Calculator.rar".toString();
//读到流中
InputStream inStream = new FileInputStream("E:/ProjectJAVA/resouce.rar");
//设置输出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition",
"attachment; filename=\"" + fileName + "\"");
//循环取出流中的数据
byte[] b = new byte[100];
int len;
while((len = inStream.read(b)) >0)
response.getOutputStream().write(b,0,len);
inStream.close();
%>
String fileName = "resouce.rar".toString();
InputStream inStream = new FileInputStream("E:/ProjectJAVA/resouce.rar");
你蒋jsp代码移动到Servlet中应该就没有问题了.
应为在下载之前,已经向客户端发送了一些文本的内容了.
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
应该会出现两个空行的.用servlet就没有问题了.
直接点击是可以下载的,但不能用网络蚂蚁下载
谁能解决用网络蚂蚁下载的问题啊?import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;public class FileDownload extends HttpServlet { //Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { String fileName = "resouce.rar"; //读到流中
InputStream inStream = new FileInputStream("E:/ProjectJAVA/resouce.rar"); //设置输出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition",
"attachment; filename=\"" + fileName + "\""); //循环取出流中的数据
byte[] b = new byte[10000];
int len;
while((len = inStream.read(b)) >0)
response.getOutputStream().write(b,0,len);
inStream.close(); }}
byte[] b = new byte[10000];
修改这个值就可以下载更大的文件
不是吧?我要下载六百兆的文件,岂不是要六百兆的内存?
直接点击链接,是可以把文件下载下来的(中文文件名也是没问题的)。可是我用网络蚂蚁下载就不行,weblogic控制台就打出错误信息
服务器是weblogic8.1,winXP(win2000上也是同样的错误)java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at weblogic.servlet.internal.ChunkUtils.writeChunkTransfer(ChunkUtils.java:250)
at weblogic.servlet.internal.ChunkUtils.writeChunks(ChunkUtils.java:226)
at weblogic.servlet.internal.ChunkOutput.flush(ChunkOutput.java:296)
at weblogic.servlet.internal.ChunkOutput.checkForFlush(ChunkOutput.java:371)
at weblogic.servlet.internal.ChunkOutput.write(ChunkOutput.java:241)
at weblogic.servlet.internal.ChunkOutputWrapper.write(ChunkOutputWrapper.java:114)
at weblogic.servlet.internal.ServletOutputStreamImpl.write(ServletOutputStreamImpl.java:171)
at walkfish.web.servlet.FileDownload.downloadFiles(FileDownload.java:75)
at walkfish.web.servlet.FileDownload.doPost(FileDownload.java:25)
at walkfish.web.servlet.FileDownload.doGet(FileDownload.java:56)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1053)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:387)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:305)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6310)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:317)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3622)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2569)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:197)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:170)下面是我的下载程序(servlet)
import javax.servlet.SingleThreadModel;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.net.URLEncoder;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.File;import walkfish.web.util.ServerGlobal;public class FileDownload
extends HttpServlet
implements SingleThreadModel { private static final String CONTENT_TYPE = "text/html; charset=gb2312";
private OutputStream outputStream = null;
private File fileLoad = null; public void doPost(HttpServletRequest request,HttpServletResponse response) {
download();
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
request.setCharacterEncoding("gb2312"); String strFileName = request.getParameter("FileName");
String strFilePath = request.getParameter("FilePath");
strFilePath = "d:/resource/" + strFilePath; outputStream = response.getOutputStream(); response.setHeader("content-disposition",
"attachment; filename="
+ URLEncoder.encode(strFileName, "UTF-8"));
response.setContentType("application/x-tar"); try {
fileLoad = new File(strFilePath + strFileName);
response.setHeader("Content_Length",
String.valueOf(fileLoad.length()));
}
catch(Exception e){
e.printStackTrace();
return;
} doPost(request,response);
} private void download() { byte[] bt = new byte[1024];
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(fileLoad);
}
catch (IOException e) {
e.printStackTrace();
return;
} int iRead = 0;
try {
iRead = inputStream.read(bt);
while (iRead != -1) {
outputStream.write(bt, 0, iRead); // 错误是从这里抛出的
iRead = inputStream.read(bt);
}
}
catch (Exception e) {
e.printStackTrace();
} try {
outputStream.close();
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
return;
} }}
后面加一句试试
outputStream.flush();
我试了
我在 outputStream.write(bt, 0, iRead);
这句前面加上了System.out.print(iRead + "\t");
这句后面加上了outputStream.flush();测试发现,如果没有flush(),循环能走12次
有flush(),循环只走了一次
抛出同样的异常