如何使用 Java 分块上传大文件? [英] How could I upload a large file in chunks using Java?

查看:36
本文介绍了如何使用 Java 分块上传大文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用 Java 分块上传一个大文件.

有什么示例代码可以参考吗?

解决方案

*可以使用 plupload 来完成.这是示例.我的 index.html 如下:-

 <头><meta http-equiv="content-type" content="text/html; charset=UTF-8"/><title>上传</title><!-- 生产--><script type="text/javascript" src="js/plupload.full.min.js"></script><!-- 调试<script type="text/javascript" src="../js/moxie.js"></script><script type="text/javascript" src="../js/plupload.dev.js"></script>--><body style="font: 13px Verdana; background: #eee; color: #333"><div id="文件列表"></div><br/><button id="pickfiles" >选择文件</button><button id="uploadfiles" >上传</button><div id="容器">

<br/><pre id="控制台"></pre><script type="text/javascript">//自定义示例逻辑var uploader = new plupload.Uploader({运行时:'html5',browse_button : 'pickfiles',//你可以传递一个 id...容器:document.getElementById('container'),//... 或 DOM 元素本身url : 'UploadAction',//upload.php块大小:'1mb',方法:'POST',flash_swf_url : 'js/Moxie.swf',silverlight_xap_url : 'js/Moxie.xap',过滤器:{max_file_size : '100gb',mime_types: [{title : "图片文件", 扩展名: "jpg,gif,png"},{title : "Zip files", extensions: "zip,txt,vmdk"}]},在里面: {PostInit:函数(){document.getElementById('filelist').innerHTML = '';document.getElementById('uploadfiles').onclick = function() {上传者.开始();返回假;};},文件添加:功能(向上,文件){plupload.each(文件,功能(文件){document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">'+ file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';});},上传进度:函数(向上,文件){document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = ''+ file.percent + "%";},错误:函数(向上,错误){document.getElementById('console').appendChild(document.createTextNode(" Error #" + err.code + ":" + err.message));}}});上传者.init();<!-- 结束片段-->

我的java后端代码(Servlet)如下:-

import java.io.BufferedOutputStream;导入 java.io.File;导入 java.io.FileOutputStream;导入 java.io.IOException;导入 java.io.InputStream;导入 java.io.OutputStream;导入 javax.servlet.ServletException;导入 javax.servlet.ServletOutputStream;导入 javax.servlet.http.HttpServlet;导入 javax.servlet.http.HttpServletRequest;导入 javax.servlet.http.HttpServletResponse;导入 org.apache.commons.fileupload.FileItemIterator;导入 org.apache.commons.fileupload.FileItemStream;导入 org.apache.commons.fileupload.servlet.ServletFileUpload;导入 org.apache.commons.fileupload.util.Streams;公共类 UploadAction 扩展了 HttpServlet {私有静态最终长serialVersionUID = 3447685998419256747L;private static final String RESP_SUCCESS = "{"jsonrpc" : "2.0", "result" : "success", "id" : "id"}";private static final String RESP_ERROR = "{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "无法打开输入流."}, "id" : "id"}";public static final String JSON = "application/json";公共静态最终 int BUF_SIZE = 2 * 1024;public static final String FileDir = "/home/asjha/uploads/";私有 int 块;私有 int 块;私人字符串名称;私人字符串用户;私人字符串时间;protected void doPost(HttpServletRequest req, HttpServletResponse resp) 抛出 ServletException, IOException {String responseString = RESP_SUCCESS;boolean isMultipart = ServletFileUpload.isMultipartContent(req);如果(isMultipart){ServletFileUpload 上传 = 新的 ServletFileUpload();尝试 {FileItemIterator iter = upload.getItemIterator(req);而 (iter.hasNext()) {FileItemStream item = iter.next();InputStream input = item.openStream();//处理表单域.if(item.isFormField()){String fileName = item.getFieldName();字符串值 = Streams.asString(input);if("name".equals(fileName)){this.name = 值;}else if("chunks".equals(fileName)){this.chunks = Integer.parseInt(value);}else if("chunk".equals(fileName)){this.chunk = Integer.parseInt(value);}else if("user".equals(fileName)){this.user = 值;}else if("time".equals(fileName)){this.time = 值;}}//处理多部分 MIME 编码文件.别的 {文件 dstFile = 新文件(文件目录);如果 (!dstFile.exists()){dstFile.mkdirs();}File dst = new File(dstFile.getPath()+ "/" + this.name);保存上传文件(输入,dst);}}}捕获(异常 e){responseString = RESP_ERROR;e.printStackTrace();}}//不是多部分 MIME 请求.别的 {responseString = RESP_ERROR;}if(this.chunk == this.chunks - 1){System.out.println("name"+this.name);}resp.setContentType(JSON);byte[] responseBytes = responseString.getBytes();resp.setContentLength(responseBytes.length);ServletOutputStream 输出 = resp.getOutputStream();output.write(responseBytes);输出.flush();}private void saveUploadFile(InputStream input, File dst) 抛出 IOException {输出流输出 = null;尝试 {如果(dst.exists()){out = new BufferedOutputStream(new FileOutputStream(dst, true),BUF_SIZE);} 别的 {out = new BufferedOutputStream(new FileOutputStream(dst),BUF_SIZE);}字节 [] 缓冲区 = 新字节 [BUF_SIZE];int len = 0;while ((len = input.read(buffer)) > 0) {out.write(buffer, 0, len);}} 捕获(异常 e){e.printStackTrace();} 最后 {如果(空!= 输入){尝试 {input.close();} catch (IOException e) {e.printStackTrace();}}如果(空!= 出){尝试 {关闭();} catch (IOException e) {e.printStackTrace();}}}}}

详情请参考plupload,在github上你可以看到jakobadam和rocky的示例项目.

如果需要上传多个文件,请告诉我.使用 plupload 我们可以上传任意数量的任意大小的文件.此示例适用于非常大的单个文件上传.不要忘记包含 plupload.full.min.js.希望这有助于*强调文字**

I need to upload a large file in chunks using Java.

Is there any sample code I can refer to?

解决方案

*It can be done using plupload. Here is sample. My index.html is as under:-

    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>Upload</title>
    <!-- production -->
    <script type="text/javascript" src="js/plupload.full.min.js"></script>
    <!-- debug 
    <script type="text/javascript" src="../js/moxie.js"></script>
    <script type="text/javascript" src="../js/plupload.dev.js"></script>
    -->
    </head>
    <body style="font: 13px Verdana; background: #eee; color: #333">
    <div id="filelist"></div>
    <br />
        <button id="pickfiles" >Select file</button> 
        <button id="uploadfiles" >Upload</button>
        <div id="container">
    </div>
    <br />
    <pre id="console"></pre>
    <script type="text/javascript">
    // Custom example logic
    var uploader = new plupload.Uploader({
        runtimes : 'html5',
        browse_button : 'pickfiles', // you can pass an id...
        container: document.getElementById('container'), // ... or DOM Element itself
        url : 'UploadAction',//upload.php
        chunk_size : '1mb',
        method:'POST',
        flash_swf_url : 'js/Moxie.swf',
        silverlight_xap_url : 'js/Moxie.xap',

        filters : {
            max_file_size : '100gb',
            mime_types: [
                {title : "Image files", extensions : "jpg,gif,png"},
                {title : "Zip files", extensions : "zip,txt,vmdk"}
            ]
        },
        init: {
            PostInit: function() {
                document.getElementById('filelist').innerHTML = '';
                document.getElementById('uploadfiles').onclick = function() {
                    uploader.start();
                    return false;
                };
            },
            FilesAdded: function(up, files) {
                plupload.each(files, function(file) {
                    document.getElementById('filelist').innerHTML += '<div id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></div>';
                });
            },
            UploadProgress: function(up, file) {
                document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML = '<span>' + file.percent + "%</span>";
            },
            Error: function(up, err) {
                document.getElementById('console').appendChild(document.createTextNode("
Error #" + err.code + ": " + err.message));
            }
        }
    });
    uploader.init();
    </script>
    </body>
    </html>
<!-- end snippet -->

My java backend code(Servlet) is as under:-

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
public class UploadAction extends HttpServlet {
    private static final long serialVersionUID = 3447685998419256747L;
    private static final String RESP_SUCCESS = "{"jsonrpc" : "2.0", "result" : "success", "id" : "id"}";
    private static final String RESP_ERROR = "{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}";
    public static final String JSON = "application/json";
    public static final int BUF_SIZE = 2 * 1024;
    public static final String FileDir = "/home/asjha/uploads/";

    private int chunk;
    private int chunks;
    private String name;
    private String user;
    private String time;
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String responseString = RESP_SUCCESS;
        boolean isMultipart = ServletFileUpload.isMultipartContent(req);

        if(isMultipart){
            ServletFileUpload upload = new ServletFileUpload();
            try {
                FileItemIterator iter = upload.getItemIterator(req);
                while (iter.hasNext()) {
                    FileItemStream item = iter.next();
                    InputStream input = item.openStream();
                    // Handle a form field.
                    if(item.isFormField()){
                        String fileName = item.getFieldName();
                        String value = Streams.asString(input);
                        if("name".equals(fileName)){
                            this.name = value;
                        }else if("chunks".equals(fileName)){
                            this.chunks = Integer.parseInt(value);
                        }else if("chunk".equals(fileName)){
                            this.chunk = Integer.parseInt(value);
                        }else if("user".equals(fileName)){
                            this.user = value;
                        }else if("time".equals(fileName)){
                            this.time = value;
                        }
                    }

                    // Handle a multi-part MIME encoded file.
                    else {
                        File dstFile = new File(FileDir);
                        if (!dstFile.exists()){
                            dstFile.mkdirs();
                        }

                        File dst = new File(dstFile.getPath()+ "/" + this.name);

                        saveUploadFile(input, dst);
                    }
                }
            }
            catch (Exception e) {
                responseString = RESP_ERROR;
                e.printStackTrace();
            }
        }

        // Not a multi-part MIME request.
        else {
            responseString = RESP_ERROR;
        }

        if(this.chunk == this.chunks - 1){
            System.out.println("name"+this.name);
        }
        resp.setContentType(JSON);
        byte[] responseBytes = responseString.getBytes();
        resp.setContentLength(responseBytes.length);
        ServletOutputStream output = resp.getOutputStream();
        output.write(responseBytes);
        output.flush();
    }
    private void saveUploadFile(InputStream input, File dst) throws IOException {
        OutputStream out = null;
        try {
            if (dst.exists()) {
                out = new BufferedOutputStream(new FileOutputStream(dst, true),
                        BUF_SIZE);
            } else {
                out = new BufferedOutputStream(new FileOutputStream(dst),
                        BUF_SIZE);
            }
            byte[] buffer = new byte[BUF_SIZE];
            int len = 0;
            while ((len = input.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != input) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != out) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Please refer to plupload for details and on github you can see sample projects by jakobadam and rocky.

Please let me know if multiple file upload is required. Using plupload we can upload any number of files of any sizes. This sample is for single file upload of very large size. dont forget to include plupload.full.min.js. Hope this helps*emphasized text**

这篇关于如何使用 Java 分块上传大文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆