获取手机端上传的文件流

平台提供了专门上传的API-$file.upload()或summer.upload(),这是针对单个文件的上传操作,操作中不能携带参数,此方法做多个文件上传只能通过循环实现。
如果是一个请求中有参数又有文件,可以用以下方法实现。

在callAction中携带上传文件,代码分两部分

1、端上通过callAction的mauploadpath参数将图片携带到MA

DSL工程:

  1. $service.writeConfig({
  2. "host" : "10.2.112.58",//向configure中写入host键值
  3. "port" : "8085"//向configure中写入port键值
  4. });
  5. $service.callAction({
  6. viewid: "com.yonyou.TestFileUploadController",//部署在MA上的Controller的包名
  7. action: "testUpload",//后台Controller的方法名,
  8. params: {a:1, b:2},//自定义参数,json格式
  9. mauploadpath : "文件本地路径",
  10. autoDataBinding: false,//请求回来的数据会在Context中,是否进行数据绑定,默认不绑定
  11. contextmapping: "fieldPath",//将返回结果映射到指定的Context字段上,支持fieldName和xx.xxx.fieldName字段全路径,如未指定contextmapping则替换整个Context
  12. callback: "uploadCallBack()",//请求成功后回调js方法
  13. error: "uploadErrCallBack()"//请求失败回调的js方法
  14. })

Summer工程:

  1. summer.writeConfig({
  2. "host" : "10.2.112.58",//向configure中写入host键值
  3. "port" : "8085"//向configure中写入port键值
  4. });
  5. summer.callAction({
  6. viewid: "com.yonyou.TestFileUploadController",//部署在MA上的Controller的包名
  7. action: "testUpload",//后台Controller的方法名,
  8. params: {a:1, b:2},//自定义参数,json格式
  9. mauploadpath : "文件本地路径",
  10. callback: "uploadCallBack()",//请求成功后回调js方法
  11. error: "uploadErrCallBack()"//请求失败回调的js方法
  12. })

2、MA通过this.getData(UPLOAD_FILE)获取到文件进行后续操作,Controller类需要继承UMCommonController

  1. public class ListTest extends UMCommonController {
  2. public String upload(String test) throws FileUploadException, IOException {
  3. Object inObj = getData(UPLOAD_FILE);
  4. Object filename = getData(UPLOAD_FILE_NAME);
  5. if (inObj != null && filename != null) {
  6. InputStream in = (InputStream) inObj;
  7. String value = filename.toString();
  8. int start = value.lastIndexOf("/");
  9. String fileName = value.substring(start + 1);
  10. String saveName = fileName;
  11. File file = new File("D:\", saveName);
  12. if (!file.exists()) {
  13. file.createNewFile();
  14. }
  15. OutputStream out = null;
  16. try {
  17. out = new FileOutputStream(file);
  18. int length = 0;
  19. byte[] buf = new byte[1024];
  20. while ((length = in.read(buf)) != -1) {
  21. out.write(buf, 0, length);
  22. }
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. } finally {
  26. if (in != null) {
  27. try {
  28. in.close();
  29. } catch (IOException e) {
  30. }
  31. }
  32. if (out != null) {
  33. try {
  34. out.close();
  35. } catch (IOException e) {
  36. }
  37. }
  38. }
  39. }
  40. return "{a:b}";
  41. }
  42. }

说明
多个文件批量上传时需要mauploadpath参数中的多个文件用”,”分开;然后MA在获取时this.getData()参数为UPLOAD_MULTI_FILE,data此时为多个文件的二进制流Map。

还有另一种方法是通过$file.upload或summer.upload()方法上传,然后通过key在Controller中获取文件,再进行后续操作;这种方法会在MA上保存一份文件,不适用文件终点非MA的需求。

注意
不管是使用callAction,还是使用upload上传文件都需要勾选上传(upload)插件,方法如下:

文档更新时间: 2018-04-25 10:34