2 aalijie aalijie 于 2014.12.02 11:15 提问

http协议无法上传超过10M文件到服务器

上传10M以下的没有问题,上传10M以上的就无法从服务器获得响应值,这是为什么,http协议如何实现大文件上传

URL url = new URL(ManageConfigUtils.IMG_UPLOAD_PATH);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Content-Type",
ContentType.multipart_form_data);
con.setRequestProperty("Charset", "UTF-8");
con.setInstanceFollowRedirects(true);
con.setDoOutput(true);
con.setDoInput(true);
con.setReadTimeout(300 * 1000);
con.setChunkedStreamingMode(1024 * 1024);
con.connect();

        StringBuffer buffer = new StringBuffer();
        buffer.append("\r\n--LamfireFormBoundaryucJiylDzwZWyoOSF\r\n");
        buffer.append("Content-Disposition: form-data; name=\"file\"; filename=\""
                + file.getFileName() + "\"\r\n");
        buffer.append("Content-Type: application/octet-stream\r\n\r\n");
        OutputStream os = new DataOutputStream(con.getOutputStream());
        os.write(buffer.toString().getBytes());
        InputStream is = file.getFileItem().getInputStream();
        byte[] filebuffer = new byte[10240];
        synchronized (filebuffer) {
            int length = -1;
            while (-1 != (length = is.read(filebuffer))) {
                os.write(filebuffer, 0, length);
            }
        }
        os.flush();
        buffer = new StringBuffer();
        buffer.append("\r\n--LamfireFormBoundaryucJiylDzwZWyoOSF\r\n");
        buffer.append("Content-Disposition: form-data; name=\"" + "filedir"
                + "\"\r\n");
        buffer.append("Content-Type: text/plain;charset=" + "UTF-8"
                + "\r\n\r\n");
        buffer.append(dir);
        os.write(buffer.toString().getBytes());

        os.flush();
        os.close();

        is = con.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                con.getInputStream()));
        String line = null;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        con.disconnect();

2个回答

u014492098
u014492098   2014.12.02 13:06

con.setChunkedStreamingMode(1024 * 1024); 这句话的设置问题吧

aalijie
aalijie 回复wgw335363240: 想请教一下这个的原因?大小大概会限制到多少?是不是说http就不该用来传大文件
3 年多之前 回复
wgw335363240
wgw335363240 如果要设置了这个参数,也会 影响上传文件的大小。
3 年多之前 回复
aalijie
aalijie 应该不是,如果没有这个,文件大于10M就会报内存溢出错误
3 年多之前 回复
wgw335363240
wgw335363240   2014.12.02 17:13

http协议没有规定post的数据的限制,理论上可以上传任何大的数据,但是 由于http传输大数据时的不稳定,而且会一直占用服务器端的资源,
所以大文件还是建议走 ftp的方式上传,上传完通过http请求通知服务器做业务逻辑。
服务器没有响应,需要看看是服务器一直在处理数据,只是还没有上传完,还是服务器报错了,结合服务器的日志看一下,通常都能发现问题。

wgw335363240
wgw335363240 回复aalijie: 在插件中编写代码检测文件上次上传的chunk位置,seek到文件的指定字节开始读取,这样就可以断点续传,不使用插件,只用浏览器是做不到断点续传的
3 年多之前 回复
wgw335363240
wgw335363240 回复aalijie: 想使用断点续传,需要浏览器上能够开发插件,比如IE支持的ActiveX,或者flash插件,在插件中
3 年多之前 回复
aalijie
aalijie 还想问一下,如果要使用http上传大文件,有什么方法?断点可以么,我在网上只看到断点下载,上传没什么资料,还是要拼请求头和消息体么?
3 年多之前 回复
aalijie
aalijie 谢谢,你说的很好,ftp要使用客户端,所以公司要处理后台上传文件只用了http协议,服务器日志我是看不到的,你还有其他的建议么?
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!