首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

servlet下传文件有关问题(ISO无法下传)

2012-12-20 
servlet上传文件问题(ISO无法上传)如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个

servlet上传文件问题(ISO无法上传)
如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800M的那个好像有一部分没有上传,而3.5G的在TOMCAT目录下容量是0K!,目前还没从算法上找出问题(虽然是人家的算法,但我已经是理解了),所以请高手来看看。
JSP部分


<%@ page language="java" contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form name="form1" method="post" action="up" enctype="multipart/form-data">
<input type="file" name="select" size=50>
<input type="submit" value="提交">
</form>
</body>
</html>


servlet部分


package sjw.pratice;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.FileItemFactory;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class up
 */
@WebServlet("/up")
public class up extends HttpServlet {
private static final long serialVersionUID = 1L;
    public up() {
        super();
    }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletInputStream in=request.getInputStream();
int len=request.getContentLength();
response.setContentType("text/html;utf-8");
PrintWriter out=response.getWriter();
byte[] b=new byte[128];
int i=0;
i=in.readLine(b, 0, 128);
len-=i;
i=in.readLine(b, 0, 128);
len-=i;
String s=new String(b,0,i);
String filename=s.substring(s.lastIndexOf("=")+2,s.lastIndexOf("""));
if(filename.equals("")==false)
{
String savename=filename.substring(filename.lastIndexOf("\")+1);
i=in.readLine(b, 0, 128);
len-=i;
i=in.readLine(b, 0, 128);
len-=i;
FileOutputStream fos=new FileOutputStream(request.getRealPath("")+"/"+savename);
while((i=in.readLine(b, 0, 128))!=-1&&len>47)
{
len-=i;
fos.write(b,0,i);
}
out.print("<script>alert('success');location.href='up.jsp';</script>");
}
else
{
out.print("<script>alert('fail');location.href='up.jsp';</script>");
}
}

}


------最佳解决方案--------------------


引用:
引用:引用:如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800M的那个好像有一部分没有上传,而3.5G的在TOMCAT目录下容量是0K!,目前还没从算……

传统的HTML方式已经难已满足超大文件的上传。别说是100MB,50MB对服务器来说都是非常大的,服务不仅要专门开一个socket连接接一直等待这个文件上传完毕,还要分配同等大小的内存来保存这个文件对服务器造成的压力相当的大,而且这个压力将会随着用户的增加而成几何式的增加。就算是用Flash也不行,因为目前的Flash不支持断点续传操作,也不支持文件分块操作,Flash和传统的HTML方式上传原理一样。用Flash上传100MB图片,服务器也要分配100MB的内存。10个用户同时上传100MB数据的话,就要吃掉服务器1G的内存。

有些朋友试过用Flash文件上传控件来上传超大文件,但是经常遇到上传超时,或上传出错的问题。这是因为现在的Flash文件上传控件使用的技术还是和传统的HTML方式上传一样。让服务器打开一个连接,然后一直等到客户端把这个文件传完。但是在实际的网络环境中,用户的网速可能只有50KB/S,上传200MB的文件可能要花2.8小时。但是服务器的SESSION连接不可能为用户等2.8个小时,这还不考虑复杂的网络环境,比如数据包丢失的情况。如果遇到数据包丢失和网络异常的情况,那用户前面的100MB文件是白传了。这相当于浪费了用户一个小时的时间。给用户带来了极差的体验。
对于服务器来讲,连接资源是非常有限的,就算服务器能够为一个用户等2.8个小时,如果用户访问一大,每一个用户都占用一个连接并且占用这么长时间,那么服务器的并发处理能力就变的非常低了。其它的用户就算是请求一个简单的1KB的HTML页面也必须等服务器处理完前面的用户的请求。

同时Flash也无法满足超大文件的上传需求。因为超大文件上传需求有一个要求就是要保证数据传输的稳定性。比如用户上传1G的文件,已经上传了500MB,这时网突然断了,但是用户希望下次传这个文件的时侯是从最后一次上传的位置开始传输,也就是从500MB的位置开始传输,这一个需求是Flash是无法做到的。

像QQ邮箱中的超大附件上传功能,115网盘中的超大附件上传控件,华为网盘(DBank),金山快盘他们都是使用控件来实现超大文件上传功能的。这样做主要是减轻服务器压力(服务器响应时间更快,并发处理能力更强),节省服务器内存(服务器不必为每个用户都分配与文件同等大小的内存),同时提高用户体验(用户可在复杂的网络环境中上传超大文件)。

当然从技术角度来讲,像这些互联网知名企业也是考虑了支撑海量用户的分布式文件存储构架设计。因为他们的文件存储服务器不可能是一台,而且会动态的随着用户数的增加而增加。

如果真如某些朋友所说的Flash控件就能解决超大文件上传的问题,那么腾迅也不会花那么大的力气专门为QQ邮箱开发一个控件了。

[其他解释]
引用:
引用:引用:引用:引用:如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800……

控件到不用你自已现在,网上有一个Web超大文件上传断点续传控件:http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html
此控件支持100G文件的断点续传操作,提供了完善的开发文档,支持文件MD5验证,支持文件批量上传。
粘贴文件,简化选择文件操作:

文件MD5值计算进度:

文件MD5值计算完毕

服务器根据MD5检测是否存在相同文件

续传文件

从服务器加载文件列表

文件上传中

文件上传完毕

上传文件夹

与Discuz!X2整合-后台安装断点续传控件

与Discuz!X2整合-后台启用断点续传控件

与Discuz!X2整合-后台断点续传控件启用成功

与Discuz!X2整合-前台发帖页面

与Discuz!X2整合-上传


页面调用示例代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HTTP断点续传控件与MySQL数据库演示页面(UTF-8)</title>
    <link href="HttpUploader/HttpUploader.css" type="text/css" rel="Stylesheet"/>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/FileLister.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/HttpUploader.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/combinbox.js"></script>
    <script type="text/javascript" src="HttpUploader/jquery-1.3.2.min.js"></script>
    <script language="javascript" type="text/javascript">
    var cbItemLast = null;
    var cbMgr = new CombinBoxMgr();

    $(document).ready(function()
    {
    cbMgr.LoadInControl("FilePanel");
    cbMgr.Init();
    });
    </script>
</head>
<body>


<div id="FilePanel"></div>
</body>
</html>


资源下载:
CAB安装包
EXE安装包
开发文档
升级日志 
ASP.NET(C#)示例代码:
ASP.NET-ACCESS示例
ASP.NET-SQL2005示例
JSP示例代码:
JSP-ACCESS-GB2312示例
JSP-ACCESS-UTF8示例
JSP-SqlServer2005-UTF8示例
JSP-MySQL-UTF8示例
PHP示例代码:
PHP-MySQL-UTF8示例
Chrome,Firefox,IE断点续传控件示例(以下示例已整合IE32,IE64,Firefox,Chrome平台的插件)
ASP.NET-ACCESS示例
ASP.NET-SQL2005示例
JSP示例代码:
JSP-ACCESS-GB2312示例
JSP-ACCESS-UTF8示例
JSP-SqlServer2005-UTF8示例
JSP-MySQL-UTF8示例
PHP示例代码:
PHP-MySQL-UTF8示例

[其他解释]
引用:
引用:引用:如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800M的那个好像有一部分没有上传,而3.5G的在TOMCAT目录下容量是0K!,目前还没从算……

楼上分析的不错。我们之前做的一个应用也是遇到过这个问题。不过我们问题比楼主更严重,用户在我们的系统中上传10MB都失败。或者非常慢。后来我们还是用控件解决的这个问题。

传统的HTML上传方式难已满足超大文件的上传需求,因为使用传统HTML方式向服务器上传超大文件时,浏览器会建立一个连接,然后通过这个SOCKET连接向服务器POST数据。流程是没有问题,但是在国内由于许多地区的网络环境不稳定,同时速度也不快,这就导致浏览器建立的这个边接容易断开,或者是超时。比如你是广州联通网速是10KB/S,你向北京电信服务器上传数据,这速度肯定非常慢,因为跨网了,电信的网相互访问就快,而服务器不可能为你这一个用户等待这么长时间,因为这个连接资源是非常宝贵的。最好的方式是一个用户请求服务器只需要5秒,这样服务器的并发访问量才会比较大,同时能够处理的用户请求就越多。

第二个问题,如果用户上传1G的文件,现在已经上传了500MB,但是突然断网了,那么你让用户再重新上传前面的500MB吗?假设用户的网速是100KB/S,那么用户需要花1.4小时来重传前面的500MB。如果是这样的话,估记用户是无法接受的。

第三个问题,无论你是用原始HTML方式(即Form表单方式)上传还是使用Flash控件上传服务端都会分配一个与客户端相同大小的内存。比如用户上传的是1G,那么服务端就会分配1G内存,如果用户上传的是5G,那么服务端也会分配5G。那么假设10G个用户同时上传5G文件,那么服务端就需要至少50G内存。一般的服务端这时就会由于内存不足而崩溃掉。

[其他解释]
引用:
引用:Servlet3.0本身就支持文件上传,无需额外的动作,比如:tomcat7。
我现在用的就是TOMCAT 7,难道只要写一个file类的表单控件提交就可以了么?


@MultipartConfig(fileSizeThreshold=1024,maxFileSize=10*1024,location="F:\\software\\apache-tomcat-7.0.23\\webapps\\upload")
@WebServlet(urlPatterns={"/upload"}) 
public class UploadServlet extends HttpServlet{

    //request提供了一个getParts()方法,就能获取到客户端上传的文件
    Collection<Part> parts = request.getParts() ;

}
就这么简单
[其他解释]
引用:
如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800M的那个好像有一部分没有上传,而3.5G的在TOMCAT目录下容量是0K!,目前还没从算法上找出问题(虽然是人家的算法,但我已经是理解了),所以请高手来看看。
JSP部分
……

这么大的文件除非你的系统是在本地自已的电脑上测试,不然真正布署到生产环境上面那是扛不住的。
[其他解释]
我用你的这个代码传了个1.74G的Ios文件完全没问题啊。

只是速度比较慢,刚开始我也以为不行,后来我发现他是慢慢的在传一直传完为止。

不过我仅仅是在本地测试的,如果上传到服务器没有试。

最后推荐你用commons-fileupload.jar这个架包进行文件上传操作。
[其他解释]
Servlet3.0本身就支持文件上传,无需额外的动作,比如:tomcat7。
[其他解释]
引用:
Servlet3.0本身就支持文件上传,无需额外的动作,比如:tomcat7。

我现在用的就是TOMCAT 7,难道只要写一个file类的表单控件提交就可以了么?
[其他解释]
引用:
引用:如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800M的那个好像有一部分没有上传,而3.5G的在TOMCAT目录下容量是0K!,目前还没从算法上找出问题(虽然是人家的算法,但我已经是……

为什么会扛不住,这个不算是做着玩的,应该会应用到一定的实际环境上的,所以求教。
------其他解决方案--------------------


引用:
引用:引用:Servlet3.0本身就支持文件上传,无需额外的动作,比如:tomcat7。
我现在用的就是TOMCAT 7,难道只要写一个file类的表单控件提交就可以了么?

@MultipartConfig(fileSizeThreshold=1024,maxFileSize=……

还是不是很理解,这段代码是放在servlet的哪个部分,是dopost部分么?
[其他解释]
引用:
引用:引用:引用:如题,也是网上找来的代码,自己调了一下,基本没什么问题,但现在遇到一个比较大的麻烦是基本EXE文件都可以上传,测试了900M的都可以,但是ISO文件上传了一个800M,一个3.5G的,通通失败,800M的那个好像有一部分没有上传,而3.5G的……

楼上两位大神说的很详细,我一个菜鸟都看得懂问题在哪里了,可是问题是我不会写控件TOT,甚至连概念都没有.......
[其他解释]
引用:
Xproer.HttpUploader5:http://www.cnblogs.com/xproer/archive/2012/10/26/2741264.html
此控件支持100G文件的断点续传操作,提供了完善的开发文档,支持文件MD5验证,支持文件批量上传。

页面调用示例代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HTTP断点续传控件与MySQL数据库演示页面(UTF-8)</title>
    <link href="HttpUploader/HttpUploader.css" type="text/css" rel="Stylesheet"/>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/FileLister.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/HttpUploader.js"></script>
    <script type="text/javascript" charset="utf-8" src="HttpUploader/combinbox.js"></script>
    <script type="text/javascript" src="HttpUploader/jquery-1.3.2.min.js"></script>
    <script language="javascript" type="text/javascript">
    var cbItemLast = null;
    var cbMgr = new CombinBoxMgr();

    $(document).ready(function()
    {
    cbMgr.LoadInControl("FilePanel");
    cbMgr.Init();
    });
    </script>
</head>
<body>
<div id="FilePanel"></div>
</body>
</html>

资源下载:
CAB安装包
EXE安装包
开发文档
升级日志 
ASP.NET(C#)示例代码:
ASP.NET-ACCESS示例
ASP.NET-SQL2005示例
JSP示例代码:
JSP-ACCESS-GB2312示例
JSP-ACCESS-UTF8示例
JSP-SqlServer2005-UTF8示例
JSP-MySQL-UTF8示例
PHP示例代码:
PHP-MySQL-UTF8示例
Chrome,Firefox,IE断点续传控件示例(以下示例已整合IE32,IE64,Firefox,Chrome平台的插件)
ASP.NET-ACCESS示例
ASP.NET-SQL2005示例
JSP示例代码:
JSP-ACCESS-GB2312示例
JSP-ACCESS-UTF8示例
JSP-SqlServer2005-UTF8示例
JSP-MySQL-UTF8示例
PHP示例代码:
PHP-MySQL-UTF8示例

不错。先收藏了。

最近我们公司做的一个项目也是遇到了这样的问题。无法传大文件。找了一些Flash的控件在本地测试还行,一布署到生产环境就不行了。

热点排行