我怎样才能上传一个大块文件使用Java块? [英] How could I upload a large file in chunks using Java?

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

问题描述



有没有我可以参考的示例代码?

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


 <!DOCTYPE html> 
< html>
< head>
< meta http-equiv =content-typecontent =text / html; charset = UTF-8/>
< title>上传< / title>
<! - - 生产 - >
< script type =text / javascriptsrc =js / plupload.full.min.js>< / script>
<! - debug
< script type =text / javascriptsrc =../ js / moxie.js>< / script>
< script type =text / javascriptsrc =../ js / plupload.dev.js>< / script>
- >
< / head>
< body style =font:13px Verdana; background:#eee; color:#333>
< div id =filelist>< / div>
< br />
< button id =pickfiles>选取档案< / button>
< button id =uploadfiles>上传< /按钮>
< div id =container>
< / div>
< br />
< pre id =console>< / pre>
< script type =text / javascript>
//定制示例逻辑
var uploader = new plupload.Uploader({
运行时:'html5',
browse_button:'pickfiles',//您可以传递一个id。 ..
container:document.getElementById('container'),// ...或DOM元素本身
url:'UploadAction',// upload.php
chunk_size:'1mb' ,
方法:'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 ,扩展名:zip,txt,vmdk}
]
},
init:{
PostInit:function(){
document.getElementById('filelist ').innerHTML ='';
document.getElementById('uploadfiles ).onclick =函数(){
uploader.start();
返回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>;

错误:function(up,err){
document.getElementById('console')。appendChild(document.createTextNode(\\\
Error#+ err.code + :+ err.message));
}
}
});
uploader.init();
< / script>
< / body>
< / html>
<! - 结束程式码片段 - >

我的java后端代码(Servlet)如下所示: - $ /

  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;
导入javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
导入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 \:\无法打开输入流。,\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;
私人诠释块;
私人字符串名称;
私人字符串用户;
私人字符串时间;
protected void doPost(HttpServletRequest req,HttpServletResponse resp)抛出ServletException,IOException {
String responseString = RESP_SUCCESS;
boolean isMultipart = ServletFileUpload.isMultipartContent(req);

if(isMultipart){
ServletFileUpload upload = new ServletFileUpload();
尝试{
FileItemIterator iter = upload.getItemIterator(req); (iter.hasNext()){
FileItemStream item = iter.next();
InputStream input = item.openStream();
//处理一个表单域。
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;
}
}

//处理多部分MIME编码的文件。
else {
文件dstFile =新文件(FileDir);
if(!dstFile.exists()){
dstFile.mkdirs();
}

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

saveUploadFile(input,dst);


$ b catch(Exception e){
responseString = RESP_ERROR;
e.printStackTrace();
}
}

//不是多部分的MIME请求。
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;
尝试{
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; ((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();




$ b code $


请参阅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("\nError #" + 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天全站免登陆