1. Rest大文件上传(RestUploadFile.ktr)

需求描述

  1. 上传文件大于10M小于500M
  2. 上传文件进行分片(5M一片要比1M分片整体时间快)
  3. 先使用java类进行功能模拟在迁移Ktr
  4. 使用Kettle+Java片段代码开发
  5. 启动步骤时可以自定义必须参数
  6. 增加UserId(如:testXiaoYu目录)
  7. 上传地址:http://**:8089/api/dlapiservice/v1/file/userdata
  8. 下载地址:http://**:8089/api/dlapiservice/v1/file/userdata/
  9. HDFS地址:http://**:50070/explorer.html#/testXiaoYu(需要查看需要92服务器远程到153服务器查看)

截图步骤说明

  指定大文件上传

  片段代码

  运行成功结果

上传片段代码

  1. import java.io.*;
  2. import org.apache.http.HttpResponse;
  3. import org.apache.http.client.HttpClient;
  4. import org.apache.http.client.methods.HttpPost;
  5. import org.apache.http.entity.mime.HttpMultipartMode;
  6. import org.apache.http.entity.mime.MultipartEntityBuilder;
  7. import org.apache.http.impl.client.HttpClients;
  8.  
  9. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  10.  
  11. Object[] r = getRow();
  12.  
  13. if (r == null) {
  14. setOutputDone();
  15. return false;
  16. }
  17.  
  18. r = createOutputRow(r, data.outputRowMeta.size());
  19.  
  20. String urlString = get(Fields.In, "url").getString(r);
  21. String filename = get(Fields.In, "filename").getString(r);
  22. String filepath = get(Fields.In, "filepath").getString(r);
  23. // String action = get(Fields.In, "action").getString(r);
  24. String userId = get(Fields.In, "userid").getString(r);
  25.  
  26. int partsize = 1024 * 1024 * 5;
  27. File file = new File(filename);
  28. HttpClient httpClient = HttpClients.createDefault();
  29. HttpPost post = new HttpPost(urlString);
  30. MultipartEntityBuilder entity = MultipartEntityBuilder.create();
  31. entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  32. entity.addTextBody("filepath", filepath);
  33. entity.addTextBody("userId", userId);
  34.  
  35. try {
  36. //Make HTTP Call
  37. if (file == null || file.getAbsolutePath() == null) {
  38. get(Fields.Out, "http_status").setValue(r,"失败");
  39. } else {
  40.  
  41. long filelenght = file.length();
  42. if (filelenght <= partsize) {
  43. entity.addBinaryBody("file", file);
  44. entity.addTextBody("action", "create");
  45. post = new HttpPost(urlString);
  46. post.setEntity(entity.build());
  47. HttpResponse response = httpClient.execute(post);
  48. //设置返回值
  49. String httpStatusCode = String.valueOf(response.getStatusLine().getStatusCode());
  50. // System.out.println("****上传完成*************:" + httpStatusCode + "------result:" + result);
  51. if(httpStatusCode.equals("200")||httpStatusCode.equals("201"))
  52. {
  53. get(Fields.Out, "http_status").setValue(r,"成功");
  54. }
  55. else
  56. {
  57. get(Fields.Out, "http_status").setValue(r,"失败");
  58. }
  59. }else {
  60. int endPosition = 0;//子文件结束位置
  61. int count = (filelenght % partsize != 0) ? (int) (filelenght / partsize + 1) : (int) (filelenght / partsize);
  62.  
  63. try {
  64. FileInputStream fileInputStream = new FileInputStream(file);
  65. int byteslength = 0;
  66. byte[] tempbytes = new byte[partsize];
  67. byte[] array = null;
  68. int i = 1;
  69.  
  70. while ((byteslength = fileInputStream.read(tempbytes)) != -1) {
  71. endPosition += partsize;
  72. endPosition = (endPosition > filelenght) ? (int) filelenght : endPosition;
  73. array = new byte[byteslength];
  74. //System.arraycopy(tempbytes, 0, array, 0, byteslength);
  75. entity = MultipartEntityBuilder.create();
  76. if (endPosition == partsize) {
  77. entity.addTextBody("action", "create");
  78. } else {
  79. entity.addTextBody("action", "append");
  80. }
  81. entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
  82. entity.addTextBody("filepath", filepath);
  83. entity.addTextBody("userId", userId);
  84. File tempfile = new File(String.valueOf(0));
  85. FileOutputStream temfileStream = new FileOutputStream(tempfile);
  86. temfileStream.write(array);
  87. entity.addBinaryBody("file", tempfile);
  88. post = new HttpPost(urlString);
  89. post.setEntity(entity.build());
  90. temfileStream.close();
  91. httpClient = HttpClients.createDefault();
  92. HttpResponse response = httpClient.execute(post);
  93. //设置返回值
  94. String httpStatusCode = String.valueOf(response.getStatusLine().getStatusCode());
  95. get(Fields.Out, "http_statuscode").setValue(r, httpStatusCode);
  96. if (httpStatusCode.equals("200") || httpStatusCode.equals("201")) {
  97. get(Fields.Out, "http_status").setValue(r,"成功");
  98. } else {
  99. get(Fields.Out, "http_status").setValue(r,"失败");
  100. break;
  101. }
  102. i++;
  103. }
  104.  
  105. }catch (Exception e) {
  106. get(Fields.Out, "http_statuscode").setValue(r, -1);
  107. get(Fields.Out, "http_status").setValue(r, "失败:"+e.getMessage());
  108. }
  109.  
  110. }
  111. }
  112.  
  113. } catch (Exception e) {
  114. //System.out.println("==================" + e.getMessage());
  115. // Set value of HTTP Status to -1 since HTTP Post caused exception
  116. get(Fields.Out, "http_statuscode").setValue(r, -1);
  117. get(Fields.Out, "http_status").setValue(r, "失败:"+e.getMessage());
  118. } finally {
  119.  
  120. }
  121.  
  122. // get(Fields.Out, "http_statuscode").setValue(r, -1);
  123. // get(Fields.Out, "http_status").setValue(r, "失败");
  124.  
  125. // Send the row on to the next step.
  126. putRow(data.outputRowMeta, r);
  127. return true;
  128. }

2. Rest文件下载(FileDownload.ktr)

需求描述

  1. 下载上传的文件
  2. (5M一片要比1M分片整体时间快)
  3. 下载地址:http://**:8089/api/dlapiservice/v1/file/userdata/
  4. HDFS地址:http:// **:50070/explorer.html#/testXiaoYu(需要查看需要92服务器远程到153服务器查看)

下载片段代码

  1. import org.apache.http.*;
  2. import org.apache.http.client.ClientProtocolException;
  3. import org.apache.http.client.HttpClient;
  4. import org.apache.http.client.methods.HttpGet;
  5. import org.apache.http.client.utils.URIBuilder;
  6. import org.apache.http.impl.client.HttpClients;
  7.  
  8. import java.io.File;
  9. import java.io.FileOutputStream;
  10. import java.io.IOException;
  11. import java.io.InputStream;
  12. import java.net.URISyntaxException;
  13.  
  14. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
  15.  
  16. Object[] r = getRow();
  17.  
  18. if (r == null) {
  19. setOutputDone();
  20. return false;
  21. }
  22.  
  23. r = createOutputRow(r, data.outputRowMeta.size());
  24.  
  25. String urlString = get(Fields.In, "url").getString(r);
  26. String filepath = get(Fields.In, "filepath").getString(r);
  27. String folder = get(Fields.In, "folder").getString(r);
  28. String filename ="";
  29. String userId = get(Fields.In, "userid").getString(r);
  30. HttpClient httpClient = HttpClients.createDefault();
  31.  
  32. try {
  33. URIBuilder builder = new URIBuilder(urlString+"/" + userId);
  34. builder.addParameter("filepath", filepath);
  35. HttpGet httpGet = new HttpGet(builder.build());
  36. HttpResponse response = httpClient.execute(httpGet);
  37. HttpEntity entity = response.getEntity();
  38. InputStream is = entity.getContent();
  39. filename = getFileName(response);
  40. //System.out.println("-----filename--------:" + filename);
  41. File file = new File(folder + filename);
  42. file.getParentFile().mkdirs();
  43. FileOutputStream fileout = new FileOutputStream(file);
  44. byte[] buffer = new byte[1024 * 1024];
  45. int ch = 0;
  46. while ((ch = is.read(buffer)) != -1) {
  47. fileout.write(buffer, 0, ch);
  48. }
  49. is.close();
  50. fileout.flush();
  51. fileout.close();
  52. get(Fields.Out, "filename").setValue(r,filename);
  53. get(Fields.Out, "http_status").setValue(r, "成功");
  54. } catch (URISyntaxException e) {
  55. //e.printStackTrace();
  56. get(Fields.Out, "exception").setValue(r, "失败:"+e.getMessage());
  57.  
  58. } catch (ClientProtocolException e) {
  59. //e.printStackTrace();
  60. get(Fields.Out, "exception").setValue(r, "失败:"+e.getMessage());
  61.  
  62. } catch (IOException e) {
  63. //e.printStackTrace();
  64. get(Fields.Out, "exception").setValue(r, "失败:"+e.getMessage());
  65.  
  66. }
  67.  
  68. // Send the row on to the next step.
  69. putRow(data.outputRowMeta, r);
  70. return true;
  71. }
  72.  
  73. public static String getFileName(HttpResponse response) {
  74. Header contentHeader = response.getFirstHeader("Content-Disposition");
  75. String filename = null;
  76. if (contentHeader != null) {
  77. HeaderElement[] values = contentHeader.getElements();
  78. if (values.length == 1) {
  79. NameValuePair param = values[0].getParameterByName("filename");
  80. if (param != null) {
  81. try {
  82. filename = param.getValue();
  83. } catch (Exception e) {
  84. e.printStackTrace();
  85. }
  86. }
  87. }
  88. }
  89. return filename;
  90. }

  

  1. KettleDemo整体原型前提条件,Java片段代码需要引用Jar包下载路径: http://hc.apache.org/downloads.cgi

  1. Jar包拷贝

Kettle Rest大文件上传(RestUploadFile.ktr) Rest文件下载(FileDownload.ktr)的更多相关文章

  1. 解决PHP大文件上传问题

    PHP大文件上传问题    今天负责创业计划大赛的老师问我作品上报系统上传不了大文件,我当时纳闷了,做的时候没限制上传文件的大小阿,怎么会传不了呢,自己亲自体验了番,果然不 行,想了好一会儿才有点眉目 ...

  2. 使用commons-fileupload包进行大文件上传注意事项

    项目中使用 commons-fileupload-1.2.1.jar 进行大文件上传. 测试了一把,效果很不错. 总结如下: 必须设置好上传文件的最大阀值 final long MAX_SIZE = ...

  3. 因用了NeatUpload大文件上传控件而导致Nonfile portion > 4194304 bytes错误的解决方法

    今天遇到一个问题,就是“NeatUpload大文件上传控件而导致Nonfile portion > 4194304 bytes错误”,百度后发现了一个解决方法,跟大家分享下: NeatUploa ...

  4. ASP.NET 大文件上传的简单处理

    在 ASP.NET 开发的过程中,文件上传往往使用自带的 FileUpload 控件,可是用过的人都知道,这个控件的局限性十分大,最大的问题就在于上传大文件时让开发者尤为的头疼,而且,上传时无法方便的 ...

  5. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  6. BootStrap Progressbar 实现大文件上传的进度条

    1.首先实现大文件上传,如果是几兆或者几十兆的文件就用基本的上传方式就可以了,但是如果是大文件上传的话最好是用分片上传的方式.我这里主要是使用在客户端进行分片读取到服务器段,然后保存,到了服务器段读取 ...

  7. 使用NeatUpload控件实现ASP.NET大文件上传

    使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...

  8. Asp.net mvc 大文件上传 断点续传

    Asp.net mvc 大文件上传 断点续传 进度条   概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这 ...

  9. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

随机推荐

  1. Dom4j 操作文件,文件相对路径的问题

    System.out.println("xml路径:"+ServletActionContext.getServletContext().getRealPath("/zx ...

  2. 非旋treap套线段树

    BZOJ3065. 去年用pascal 块链过了.. 今年来试了试非旋treap大法   注定被块链完爆 代码留这. 第一份 :辣鸡的  垃圾回收做法  跑得极慢 #include <bits/ ...

  3. bzoj2957楼房重建——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护原点到楼顶的斜率,可以知道答案就是从原点开始斜率递增的个数: 记录一个mx数 ...

  4. bzoj4540

    莫队+st表 据说这是经典问题,但是我不会... 问题在于莫队怎么算贡献,每次移动一个位置,现在为[l,r],那么就增加了[l-1,r),r的贡献,怎么算呢?我们预处理fl,fr,fl[i]表示以i为 ...

  5. Java字符串理解

    1. 字符串基本知识 用java.lang.String类的对象表示字符串 字符串类型不是基本类型, 而是引用类型(类似于数组和对象) Java基于Unicode字符集 2. 字符串创建 public ...

  6. Numpy学习笔记<1>

    1 numpy的ndarray:一种多维数组 a:创建ndarry   注意:np.array会尝试为新建的数组一个合适的数据类型 保存在dtype中 b:嵌套序列转换为一个多维数组 c:输出数据类型 ...

  7. 程序兵法:Java String 源码的排序算法(一)

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 <程序兵法:Java Str ...

  8. C#中的explicit和implicit了解一下吧

    今天在研究公司项目框架的时候看到了下面的用法,public static implicit operator JsonData(int data);.貌似很久没用过这种隐式转换的写法了,因此重新温习一 ...

  9. HDU-2602 Bone Collector——01背包

    首先输入一个数字代表有n个样例 接下来的三行 第一行输入n  和  v,代表n块骨头,背包体积容量为v. 第二行输入n块骨头的价值 第三行输入n块骨头的体积 问可获得最大的价值为多少 核心:关键在于d ...

  10. 如何有效提升Unity Gear VR游戏性能

    http://www.vr186.com/vr_news/vr_technical_area/1093.html 好的,所以你决定用 Unity 来做一个 VR 游戏,并选定了三星 Gear vr 为 ...