问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java webservice上传大文件,该怎么处理

发布网友 发布时间:2022-04-23 07:31

我来回答

2个回答

懂视网 时间:2022-04-23 11:52

但是,即使把服务器的配置中的上传文件大小写的够大,又会受到IIS的限制,而且也不能为用户提供安全的服务。那有没有一种方法能解决大文件上传的问题呢?
肯定是有的:分片上传。
分片上传是指将想要上传的文件在前端切割成大小很小的小块,然后再传给服务器,从服务器端再将文件组合成整的文件。
先从前端说起,在分片上传的过程中,前端任务是将文件分片,分片的办法有很多,例如可以使用WebUpLoader提供的上传组件进行分片,也可以用JS与JQ提供的代码进行上传,代码实例如下:

var BYTES_PER_CHUNK = 1024 * 1024; // 每个文件切片大小定为1MB .
var slices;
var totalSlices;

//发送请求
function sendRequest() {
var blob = document.getElementById("yourID").files[0];
var start = 0;
var end;
var index = 0;


// 计算文件切片总数
slices = Math.ceil(blob.size / BYTES_PER_CHUNK);
totalSlices= slices;
while(start < blob.size) {
end = start + BYTES_PER_CHUNK;
if(end > blob.size) {
end = blob.size;
}
uploadFile(blob, index, start, end);
start = end;
index++;
if ( index>=totalSlices )
alert("Complete!!");
}
}

//上传文件
function uploadFile(blob, index, start, end) {
var xhr;
var fd;
var chunk; 
var sliceIndex=blob.name+index;
chunk =blob.slice(start,end);//切割文件

fd = new FormData();
fd.append("FileName", chunk, sliceIndex);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'Server URL', false);//false,同步上传;ture,异步上传
xhr.send(fd);
if((xhr.status >=200 && xhr.status < 300) || xhr.status == 304){
setTimeout("",10);
}else{
uploadFile(blob, index, start, end);
}
}

有了前端,当然少不了在后端的接受与组合,在这里我用ASP.Net为例,说明如何接收与组合文件。

public void RecoveryKPJD()
 {
  HttpContext context = System.Web.HttpContext.Current;
  context.Response.ContentType = "text/plain";
  //如果进行了分片
  if (context.Request.Form.AllKeys.Any(m => m == "chunk"))
  {
  //取得chunk和chunks
  int chunk = Convert.ToInt32(context.Request.Form["chunk"]);//当前分片在上传分片中的顺序(从0开始)
  int chunks = Convert.ToInt32(context.Request.Form["chunks"]);//总分片数
  //根据GUID创建用该GUID命名的临时文件夹
  string folder = Your Path + context.Request["guid"] + "/";
  string path = folder + chunk;


  //建立临时传输文件夹
  if (!Directory.Exists(Path.GetDirectoryName(folder)))
  {
   Directory.CreateDirectory(folder);
  }

  FileStream addFile = new FileStream(path, FileMode.Append, FileAccess.Write);
  BinaryWriter AddWriter = new BinaryWriter(addFile);
  //获得上传的分片数据流
  HttpPostedFile file = context.Request.Files[0];
  Stream stream = file.InputStream;

  BinaryReader TempReader = new BinaryReader(stream);
  //将上传的分片追加到临时文件末尾
  AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
  //关闭BinaryReader文件阅读器
  TempReader.Close();
  stream.Close();
  AddWriter.Close();
  addFile.Close();

  TempReader.Dispose();
  stream.Dispose();
  AddWriter.Dispose();
  addFile.Dispose();
  if (chunk == chunks - 1)
  {
   //合并文件
   ProcessRequest(context.Request["guid"], Path.GetExtension(file.FileName));
  }
  }
  else//没有分片直接保存
  {
  string targetPath = ""; //此处写文件的保存路径
  context.Request.Files[0].SaveAs(targetPath);
  }
 }

 private void ProcessRequest(string guid, string fileExt)
 {
  HttpContext context = System.Web.HttpContext.Current;
  context.Response.ContentType = "text/plain";
  string sourcePath = Path.Combine("Your Path", guid + "/");//源数据文件夹
  string targetPath = Path.Combine("Your Path", Guid.NewGuid() + fileExt);//合并后的文件

  DirectoryInfo dicInfo = new DirectoryInfo(sourcePath);
  if (Directory.Exists(Path.GetDirectoryName(sourcePath)))
  {
  FileInfo[] files = dicInfo.GetFiles();
  foreach (FileInfo file in files.OrderBy(f => int.Parse(f.Name)))
  {
   FileStream addFile = new FileStream(targetPath, FileMode.AppenFileAccess.Write);
   BinaryWriter AddWriter = new BinaryWriter(addFile);

   //获得上传的分片数据流
   Stream stream = file.Open(FileMode.Open);
   BinaryReader TempReader = new BinaryReader(stream);
   //将上传的分片追加到临时文件末尾
   AddWriter.Write(TempReader.ReadBytes((int)stream.Length));
   //关闭BinaryReader文件阅读器
   TempReader.Close();
   stream.Close();
   AddWriter.Close();
   addFile.Close();

   TempReader.Dispose();
   stream.Dispose();
   AddWriter.Dispose();
   addFile.Dispose();
  }
  }
 }

热心网友 时间:2022-04-23 09:00

  您好,我来为您解答:
  这个要借助于第三方控件来实现超大文件的上传。普通的方式肯定不行。
  希望我的回答对你有帮助。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 芙蓉古镇距离三星堆多远? 成都为何被评为旅游城市 城阳区桃花源3期西门口正在建设什么? 关于小孩子热爱生命的故事 桃花源记手游凤凰天女是几星 请问,《青城山下白素贞》中的青城山是不是指靠近成都的那个青城山?除此之外还有有关青城山的歌吗? 我和朋友要去酉阳桃花源和黔江玩,请问当地的住宿价位和旅馆名称。顺便问一下当地的民风好不好。 京东物流到不了乡镇要转第三方快递运费谁出?(急急急) 《桃花源记2》里80级跑三星环任务最多要多少级的装备? 桃花源古镇出了哪些名人? 赤峰市大庙镇发现的那个油页岩面积大概有多大?公司怎么规划的?、 长期口臭,用手捂着哈气自己闻不到,但是手指碰一下舌苔后就能闻到臭 为什么有口臭自己却闻不到 有口臭的你还敢开口吗? 青岛蓝村怎么样 中国一乡一品? 自己用手捂住嘴哈气,没有闻到难闻的口臭味,为什么老公总说我口臭难?难道我自己不知道? 电冰箱里面怎么有流水声 我要找时尚手绘墙画效果图 什么油漆水彩笔画上后能擦掉 手绘效果图的应用实例 飞利浦照明T5/T8支架哪个比较好? 飞利浦t5 t8 865是什么意思 飞利浦t5是否有暖色 艾利和T5与飞利浦SA28哪个好 飞利浦环管T5 32W好呢,还是雷士环管T5 32W 好?两者我应该选择哪一个 sandisk ixpand 64g 速度变慢 闪迪u盘ixpand该如何转接到华为手机上? 求问SanDisk的 iXpand 不小心被我格式化了,现在iphone检测不到,怎么办 我的苹果手机不知道被我怎么弄了,ID头像显示不出来,设置了几个都没用 甘梦月这个名字有什么意义 2个G的加速度就已经让人很吃不消了,为什么车子几秒加速到每小时几百公里人还一点事都没有? 单梦月的姓名打分算命生日是二月十三日. 请问汽车在怠速状态加速时,最大加速度能到多少? 梦月是个好名字吗,姓金 朱梦月个名字好吗?怎么个好法? 汽车加速度的极限是不是重力加速度 请问女孩名字12月2日早五点五十分出生该取什么名字? 求助!汽车的加速度为1.0g(g为重力加速度)。是什么原因啊? 汽车加速度超重力加速度 汽车推背感强, 加速就一定快吗? 谁能用公式计算来说明? 加速度&#47;G值什么的.