使用PipedInputStream 和 PipedOutputStream 上传文件,并更新进度

来源:互联网 发布:节奏大师网络拦截 编辑:程序博客网 时间:2024/06/16 10:33

//要上传的文件流

InputStream is = new FileInputStream(这里可以是一个文件路径,或FILE对象);

//用管道流对上传文件流进行包装,这两个必须一起声明,in将从out中读字节

PipedInputStream in =new PipedInputStream();

PipedOutputStream out = new PipedOutputStream(in);

//启动一个线程,将本地文件从流IS中读取写到管道out中,这样管理in才能读到字节

new Thread(new Runnable() {

@Override

public void run() {

  try {

//文件总长度

long fileSize =

nodeModel.getFileUploadStatusModel().getFile().length();

//每读取5M更新一次进度

long step=Long.parseLong(tools.ConfigReader.get("fileUploadUpdateInterval"));//5*1024*1024;

long tempStep =0;

//如果还有字节,线程就一直循环

while(is.available()!=0)

  {

//使用缓存

byte[] byteArray = new byte[1024];

is.read(byteArray);

out.write(byteArray);

out.flush();

tempStep+=1024;

//每读一定的字节就计算一次进度,并更新数据库;另一个显示进度的线程将从数据库中读取进度并显示出来

if(tempStep==step)

{

tempStep=0;

//每读取一部分文件内容,就更新上传进度

float okLen =fileSize-is.available();

float f=(okLen/fileSize)*100;

FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();

fileUploadStatusModel.setStatus(f+"%");

fileUploadStatusModel.setMsg("上传中");

fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);

}

  }

//这个地方要关掉

out.close();

} catch (IOException | SQLExceptione) {

 

FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();

fileUploadStatusModel.setStatus("0%");

fileUploadStatusModel.setMsg("读取文件内容出错,原因【"+e.getMessage()+"】");

try {

fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);

} catch (SQLExceptione1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

e.printStackTrace();

}

} }).start();

//启动上传线程上传文件,这个线程从管理in中读字节,写到任何想写入的地方

new Thread(new Runnable() {

@Override

public void run() {

 

try {

int resultCode =hcpAdmin.CreateFile(in,

 nodeModel.getTargetUrl(),

buildAuth(nodeModel.getTargetNamespace()));

FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();

if(resultCode==201)

{

fileUploadStatusModel.setStatus("100%");

fileUploadStatusModel.setMsg("成功");  

fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);

  

}

else

{

int code=-1;

String msg="";

if(resultCode==413)

{

code=-1;

msg="文件太大无法上传";

}

else if(resultCode==409)

{

code=409;

msg="文件已存在无法上传";

}

else if(resultCode==403)

{

code=403;

msg="协议不支持或权限不足";  

}

fileUploadStatusModel.setStatus("0%");

fileUploadStatusModel.setMsg(msg);  

fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);

}

} catch (IOException | SQLExceptione) {

FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();

fileUploadStatusModel.setStatus("0%");

fileUploadStatusModel.setMsg("向HCP写主文件过程出错,原因【"+e.getMessage()+"】");

try {

fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);

} catch (SQLExceptione1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

 

e.printStackTrace();

}

} }).start();

0 0
原创粉丝点击