datacenter.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. package com.cnd3b.restcontroller.enterprise.datacenter;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.aliyun.oss.OSSClient;
  5. import com.aliyun.oss.common.utils.BinaryUtil;
  6. import com.aliyun.oss.model.*;
  7. import com.cnd3b.common.Controller;
  8. import com.cnd3b.common.data.Rows;
  9. import com.cnd3b.common.data.SQLFactory;
  10. import com.cnd3b.utility.aliyun.oss.AliyunOSSConfigConstant;
  11. import com.cnd3b.utility.aliyun.oss.AliyunOSSUtil;
  12. import org.bytedeco.javacpp.presets.opencv_core;
  13. import p2.common.parse.A;
  14. import p2.common.parse.S;
  15. import p2.pao.PaoRemote;
  16. import p2.pao.PaoSetRemote;
  17. import p2.pao.SqlFormat;
  18. import p2.util.P2Exception;
  19. import java.io.ByteArrayInputStream;
  20. import java.io.File;
  21. import java.io.UnsupportedEncodingException;
  22. import java.net.URLDecoder;
  23. import java.nio.charset.StandardCharsets;
  24. import java.util.*;
  25. import static com.cnd3b.service.GetWechatData.sortByStartDigits;
  26. import static com.cnd3b.utility.aliyun.oss.AliyunOSSUtil.*;
  27. public class datacenter extends Controller {
  28. // String url = BUCKE_NAME_1 + "." + AliyunOSSConfigConstant.END_POINT;
  29. //根目录
  30. String rootpath = "资料中心/";
  31. /**
  32. * 构造函数
  33. *
  34. * @param content
  35. */
  36. public datacenter(JSONObject content) {
  37. super(content);
  38. }
  39. /**
  40. * 创建文件夹(OSS)
  41. *
  42. * @return
  43. */
  44. public String createFolder() {
  45. String folderName = content.getString("folderName");
  46. if (folderName.equals("") || folderName == null) {
  47. return getErrReturnObject().setErrMsg("文件夹名称不能为空").toString();
  48. }
  49. ossClient.putObject(new PutObjectRequest(BUCKE_NAME_1, rootpath + folderName, new ByteArrayInputStream("".getBytes())));
  50. ossClient.shutdown();
  51. return getSucReturnObject().toString();
  52. }
  53. /**
  54. * 删除文件夹(OSS)
  55. *
  56. * @return
  57. */
  58. public String deleteFolder() {
  59. JSONArray jsonArray = content.getJSONArray("folderName");
  60. if (jsonArray == null || jsonArray.size() == 0) {
  61. return getErrReturnObject().setErrMsg("文件夹名称不能为空").toString();
  62. }
  63. ArrayList<String> keysList = new ArrayList<>();
  64. for (Object obj : jsonArray) {
  65. keysList.add(obj.toString());
  66. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(BUCKE_NAME_1);
  67. // 设置prefix参数来获取fun目录下的所有文件。
  68. listObjectsRequest.setPrefix(obj.toString());
  69. // 递归列举目录下的所有文件。
  70. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  71. // 遍历所有文件。
  72. for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {
  73. String key = objectSummary.getKey();
  74. keysList.add(key);
  75. }
  76. }
  77. DeleteObjectsRequest request = new DeleteObjectsRequest(BUCKE_NAME_1);
  78. request.setKeys(keysList);
  79. // 发起deleteObjects请求。
  80. ossClient.deleteObjects(request);
  81. // // 查看删除结果。
  82. // for (String o : delObjResult.getDeletedObjects()) {
  83. // String keyName = null;
  84. // try {
  85. // keyName = URLDecoder.decode(o, "UTF-8");
  86. // } catch (UnsupportedEncodingException e) {
  87. // e.printStackTrace();
  88. // }
  89. // System.out.println("delete key name: " + keyName);
  90. // }
  91. ossClient.shutdown();
  92. SQLFactory sqlFactory = new SQLFactory(this, "删除文件夹");
  93. sqlFactory.addParameter_in("fpath", keysList);
  94. String sql = sqlFactory.getSQL();
  95. dbConnect.runSqlUpdate(sql);
  96. return getSucReturnObject().toString();
  97. }
  98. /**
  99. * 上传文件(OSS)
  100. *
  101. * @return
  102. */
  103. public String uploadFile() {
  104. // String filePath = content.getString("filePath");
  105. String folderPath = content.getString("folderPath");
  106. String name = content.getString("filename");
  107. String base64Str = content.getString("byteStr");
  108. byte[] byteStr = Base64.getDecoder().decode(base64Str);
  109. // if (filePath.equals("") || filePath == null) {
  110. // return getErrReturnObject().setErrMsg("文件路径不能为空").toString();
  111. // }
  112. // if (folderPath.equals("") || folderPath == null) {
  113. // folderPath = "";
  114. // }
  115. // File file = new File(filePath);
  116. // if (!file.exists()) {
  117. // return getErrReturnObject().setErrMsg("文件不存在").toString();
  118. // }
  119. String key = folderPath + name;
  120. System.err.println(key);
  121. ossClient.putObject(new PutObjectRequest(BUCKE_NAME_1, rootpath + key, new ByteArrayInputStream(byteStr)));
  122. ossClient.shutdown();
  123. return getSucReturnObject().toString();
  124. }
  125. /**
  126. * 删除文件(OSS)
  127. *
  128. * @return
  129. */
  130. public String deleteFile() {
  131. JSONArray jsonArray = content.getJSONArray("folderName");
  132. if (jsonArray == null || jsonArray.size() == 0) {
  133. return getErrReturnObject().setErrMsg("文件夹名称不能为空").toString();
  134. }
  135. List<String> keysList = new ArrayList<>();
  136. for (Object obj : jsonArray) {
  137. keysList.add(obj.toString());
  138. }
  139. DeleteObjectsRequest request = new DeleteObjectsRequest(BUCKE_NAME_1);
  140. request.setKeys(keysList);
  141. // 发起deleteObjects请求。
  142. DeleteObjectsResult delObjResult = ossClient.deleteObjects(request);
  143. // 查看删除结果。
  144. for (String o : delObjResult.getDeletedObjects()) {
  145. String keyName = null;
  146. try {
  147. keyName = URLDecoder.decode(o, "UTF-8");
  148. } catch (UnsupportedEncodingException e) {
  149. e.printStackTrace();
  150. }
  151. System.out.println("delete key name: " + keyName);
  152. }
  153. ossClient.shutdown();
  154. return getSucReturnObject().toString();
  155. }
  156. /**
  157. * 获取根目录
  158. *
  159. * @return
  160. */
  161. public String getFolders() {
  162. // 构造ListObjectsRequest请求。
  163. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(BUCKE_NAME_1);
  164. // 设置正斜线(/)为文件夹的分隔符。
  165. listObjectsRequest.setDelimiter("/");
  166. // 列出fun目录下的所有文件和文件夹。
  167. listObjectsRequest.setPrefix("资料中心/");
  168. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  169. // 遍历所有commonPrefix。
  170. ArrayList<String> commonPrefixList = new ArrayList<>();
  171. for (String commonPrefix : listing.getCommonPrefixes()) {
  172. String selectSql = "SELECT*FROM tfolder WHERE fpath='" + commonPrefix + "'";
  173. Rows rows = dbConnect.runSqlQuery(selectSql);
  174. if (rows.isEmpty()) {
  175. inseretTfolder(commonPrefix);
  176. }
  177. commonPrefixList.add(commonPrefix);
  178. }
  179. // 关闭OSSClient。
  180. ossClient.shutdown();
  181. JSONObject object = new JSONObject();
  182. object.put("folder", commonPrefixList);
  183. SQLFactory sqlFactory = new SQLFactory(this, "查询根目录");
  184. sqlFactory.addParameter_in("fpath", commonPrefixList);
  185. String sql = sqlFactory.getSQL();
  186. Rows rows = dbConnect.runSqlQuery(sql);
  187. return getSucReturnObject().setData(rows).toString();
  188. }
  189. /**
  190. * 获取指定目录下的文件和文件夹
  191. *
  192. * @return
  193. */
  194. public String getFilesOfPath() {
  195. String folderPath = content.getString("folderPath");
  196. // 构造ListObjectsRequest请求。
  197. ListObjectsRequest listObjectsRequest = new ListObjectsRequest(BUCKE_NAME_1);
  198. // 设置正斜线(/)为文件夹的分隔符。
  199. listObjectsRequest.setDelimiter("/");
  200. // 列出fun目录下的所有文件和文件夹。
  201. listObjectsRequest.setPrefix(folderPath);
  202. ObjectListing listing = ossClient.listObjects(listObjectsRequest);
  203. // 遍历所有文件。
  204. System.out.println("Objects:");
  205. List<JSONObject> objectSummaryList = new ArrayList<>();
  206. List<OSSObjectSummary> sums = listing.getObjectSummaries();
  207. //按照时间排序
  208. Collections.sort(sums, (o1, o2) -> {
  209. // TODO Auto-generated method stub
  210. long dateTime1 = o1.getLastModified().getTime();
  211. long dateTime2 = o2.getLastModified().getTime();
  212. if (dateTime1 == dateTime2) {
  213. return 0;
  214. } else {
  215. //时间正序
  216. // return dateTime1 > dateTime2 ? 1 : -1;
  217. //时间倒序
  218. return dateTime1 > dateTime2 ? -1 : 1;
  219. }
  220. });
  221. for (OSSObjectSummary objectSummary : sums) {
  222. if (!objectSummary.getKey().equals(folderPath)) {
  223. JSONObject object = new JSONObject();
  224. object.put("key", objectSummary.getKey());
  225. object.put("name", objectSummary.getKey().replace(folderPath, ""));
  226. object.put("size", objectSummary.getSize() / 1024);
  227. object.put("time", getDateTime_Str(objectSummary.getLastModified()));
  228. object.put("url", file_url + "/" + objectSummary.getKey());
  229. objectSummaryList.add(object);
  230. }
  231. }
  232. // 遍历所有commonPrefix。
  233. String newName = "";
  234. Rows tempRows = dbConnect.runSqlQuery("SELECT tfilename from tfolder WHERE fpath = '" + folderPath + "'");
  235. if (!tempRows.isEmpty()) {
  236. newName = tempRows.get(0).getString("tfilename");
  237. }
  238. ArrayList<String> commonPrefixList = new ArrayList<>();
  239. ArrayList<String> sqlList = new ArrayList<>();
  240. for (String commonPrefix : listing.getCommonPrefixes()) {
  241. String selectSql = "SELECT tfilename FROM tfolder WHERE fpath='" + commonPrefix + "'";
  242. Rows rows = dbConnect.runSqlQuery(selectSql);
  243. String[] tfilename;
  244. if (rows.isEmpty()) {
  245. tfilename = commonPrefix.split("/");
  246. } else {
  247. tfilename = rows.get(0).getString("tfilename").split("/");
  248. }
  249. sqlList.add(inseretOrUpdateTfolder(commonPrefix, newName + tfilename[tfilename.length - 1] + "/"));
  250. commonPrefixList.add(commonPrefix);
  251. }
  252. dbConnect.runSqlUpdate(sqlList);
  253. // 关闭OSSClient。
  254. ossClient.shutdown();
  255. SQLFactory sqlFactory = new SQLFactory(this, "查询根目录");
  256. sqlFactory.addParameter_in("fpath", commonPrefixList);
  257. String sql = sqlFactory.getSQL();
  258. Rows rows = dbConnect.runSqlQuery(sql);
  259. sortByStartDigits(objectSummaryList, "name");
  260. sortByStartDigits(rows, "tfilename", newName);
  261. JSONObject object = new JSONObject();
  262. object.put("files", objectSummaryList);
  263. object.put("folder", rows);
  264. return getSucReturnObject().setData(object).toString();
  265. }
  266. /**
  267. * 更新文件夹名称
  268. *
  269. * @return
  270. */
  271. public String updateFolderName() {
  272. String oldName = content.get("oldName").toString();
  273. String newName = content.get("newName").toString();
  274. String sqlSelect = "SELECT*FROM tfolder WHERE tfilename='" + oldName + "'";
  275. Rows rowsSelect = dbConnect.runSqlQuery(sqlSelect);
  276. if (rowsSelect.isEmpty()) {
  277. return getErrReturnObject().setErrMsg("未找到修改项").toString();
  278. }
  279. String sqlCheck = "SELECT*FROM tfolder WHERE tfilename='" + newName + "'";
  280. Rows rowsCheck = dbConnect.runSqlQuery(sqlCheck);
  281. if (!rowsCheck.isEmpty()) {
  282. return getErrReturnObject().setErrMsg("文件名称不能重名").toString();
  283. }
  284. String sql = "update tfolder set tfilename=replace(tfilename,'" + oldName + "','" + newName + "') where tfilename like '" + oldName + "%'";
  285. String res = dbConnect.runSqlUpdate(sql);
  286. return getSucReturnObject().setData(res).toString();
  287. }
  288. //批量设置是否可下载,包含下级文件夹
  289. public String isDownload() {
  290. JSONArray tfolderids = content.getJSONArray("tfolderids");
  291. Boolean isdownload = content.getBooleanValue("isdownload");
  292. String sql = "";
  293. ArrayList<String> sqlList = new ArrayList<>();
  294. for (Object obj : tfolderids) {
  295. Long tfolderid = Long.valueOf(obj.toString());
  296. String fpath = "";
  297. Rows rows = dbConnect.runSqlQuery("SELECT fpath from tfolder WHERE tfolderid=" + tfolderid);
  298. if (!rows.isEmpty()) {
  299. fpath = rows.get(0).getString("fpath");
  300. if (isdownload) {
  301. sql = "update tfolder set isdownload=" + 1 + " WHERE fpath like '" + fpath + "%'";
  302. } else {
  303. sql = "update tfolder set isdownload=" + 0 + " WHERE fpath like '" + fpath + "%'";
  304. }
  305. sqlList.add(sql);
  306. }
  307. }
  308. String res = dbConnect.runSqlUpdate(sqlList);
  309. return getSucReturnObject().setData(res).toString();
  310. }
  311. public String inseretOrUpdateTfolder(String name, String name2) {
  312. Long id = createTableID("tfolder", "tfolderid");
  313. // String sql = "INSERT INTO tfolder(tfolderid,rmkenable,fpath,createdate,tfilename) VALUES(" + id + ", 0,'" + name + "','" + getDateTime_Str() + "','" + name2 + "')";
  314. SQLFactory sqlFactory = new SQLFactory(this, "插入文件夹");
  315. sqlFactory.addParameter("tfolderid", id);
  316. sqlFactory.addParameter("fpath", name);
  317. sqlFactory.addParameter("tfilename", name2);
  318. return sqlFactory.getSQL();
  319. }
  320. public void inseretTfolder(String name) {
  321. Long id = createTableID("tfolder", "tfolderid");
  322. String sql = "INSERT INTO tfolder(tfolderid,rmkenable,fpath,createdate,tfilename) VALUES(" + id + ", 0,'" + name + "','" + getDateTime_Str() + "','" + name + "')";
  323. dbConnect.runSqlUpdate(sql);
  324. }
  325. /**
  326. * 申请视频转码
  327. *
  328. * @return
  329. */
  330. public String applyTranscoding() throws P2Exception {
  331. //阿里云视频转码模板
  332. String templateId = "S00000001-200030";
  333. //大于这个码率进行视频转码,mov格式的直接转码
  334. int tempBitrate = 1800;
  335. //获取支持的视频格式列表
  336. ArrayList<String> listVideo = getSupportVieoList();
  337. String type = content.getString("type");
  338. String key = content.getString("key");
  339. String outKey = "";
  340. if (type.equals("1")) {
  341. outKey = key;
  342. } else {
  343. outKey = "转码视频/" + key;
  344. }
  345. if (key.toLowerCase().contains("mov")) {
  346. AliyunOSSUtil.transcoding(templateId, key, outKey);
  347. if (type.equals("2")) {
  348. addTranscodingLog(key, outKey);
  349. }
  350. return getSucReturnObject().setData("MOV转码成功").toString();
  351. }
  352. //查询是否是可支持转码的视频
  353. boolean isVideo = false;
  354. for (String str : listVideo) {
  355. if (key.toLowerCase().contains(str.toLowerCase())) {
  356. isVideo = true;
  357. break;
  358. }
  359. }
  360. if (isVideo) {
  361. String res = AliyunOSSUtil.submitMediaInfoJob(key);
  362. JSONObject jsonObject = JSONObject.parseObject(res);
  363. //码率
  364. String bitrate = "0";
  365. if (jsonObject.containsKey("mediaInfoJob")) {
  366. JSONObject mediaInfoJob_jsonObject = jsonObject.getJSONObject("mediaInfoJob");
  367. if (mediaInfoJob_jsonObject.containsKey("properties")) {
  368. JSONObject properties_jsonObject = mediaInfoJob_jsonObject.getJSONObject("properties");
  369. bitrate = properties_jsonObject.getString("bitrate");
  370. }
  371. }
  372. System.err.println(bitrate);
  373. if (Double.parseDouble(bitrate) > tempBitrate) {
  374. AliyunOSSUtil.transcoding(templateId, key, outKey);
  375. if (type.equals("2")) {
  376. addTranscodingLog(key, outKey);
  377. }
  378. return getSucReturnObject().setData("转码成功").toString();
  379. } else {
  380. return getSucReturnObject().setData("码率低于" + tempBitrate + ",无须转码").toString();
  381. }
  382. } else {
  383. return getSucReturnObject().setData("非视频格式,无法转码").toString();
  384. }
  385. }
  386. // public String applyTranscodingOfPath() throws P2Exception {
  387. // String folderPath = content.getString("folderPath");
  388. // List<String> list = getOssFileList(folderPath);
  389. // //阿里云视频转码模板
  390. // String templateId = "S00000001-200030";
  391. // //大于这个码率进行视频转码,mov格式的直接转码
  392. // int tempBitrate = 1800;
  393. //
  394. // for (String keyPath : list) {
  395. //
  396. // String key = keyPath;
  397. // if (key.toLowerCase().contains("mov")) {
  398. // AliyunOSSUtil.transcoding(templateId, key, key);
  399. // addTranscodingLog(key, key);
  400. // System.err.println("MOV转码成功:" + keyPath);
  401. // } else {
  402. // ArrayList<String> listVideo = getSupportVieoList();
  403. // //查询是否是可支持转码的视频
  404. // boolean isVideo = false;
  405. // for (String str : listVideo) {
  406. // if (key.toLowerCase().contains(str.toLowerCase())) {
  407. // isVideo = true;
  408. // break;
  409. // }
  410. // }
  411. // if (isVideo) {
  412. // String res = AliyunOSSUtil.submitMediaInfoJob(key);
  413. // JSONObject jsonObject = JSONObject.parseObject(res);
  414. // //码率
  415. // String bitrate = "0";
  416. // if (jsonObject.containsKey("mediaInfoJob")) {
  417. // JSONObject mediaInfoJob_jsonObject = jsonObject.getJSONObject("mediaInfoJob");
  418. // if (mediaInfoJob_jsonObject.containsKey("properties")) {
  419. // JSONObject properties_jsonObject = mediaInfoJob_jsonObject.getJSONObject("properties");
  420. // bitrate = properties_jsonObject.getString("bitrate");
  421. // }
  422. // }
  423. // System.err.println(bitrate);
  424. // if (Double.parseDouble(bitrate) > tempBitrate) {
  425. // AliyunOSSUtil.transcoding(templateId, key, key);
  426. // addTranscodingLog(key, key);
  427. // System.err.println("转码成功:" + keyPath);
  428. //
  429. // } else {
  430. // System.err.println("码率低于" + tempBitrate + ",无须转码");
  431. //
  432. // }
  433. // } else {
  434. // System.err.println("非视频格式,无法转码");
  435. //
  436. // }
  437. // }
  438. //
  439. // }
  440. // return getSucReturnObject().toString();
  441. // }
  442. //支持转转码的格式
  443. public ArrayList<String> getSupportVieoList() {
  444. //3GP、AVI、FLV、MP4、M3U8、MPG、ASF、WMV、MKV、MOV、TS、WebM、MXF
  445. ArrayList<String> list = new ArrayList<>();
  446. list.add("3GP");
  447. list.add("AVI");
  448. list.add("FLV");
  449. list.add("MP4");
  450. list.add("M3U8");
  451. list.add("MPG");
  452. list.add("ASF");
  453. list.add("WMV");
  454. list.add("MKV");
  455. list.add("MOV");
  456. list.add("TS");
  457. list.add("WebM");
  458. list.add("MXF");
  459. return list;
  460. }
  461. /**
  462. * 添加转码记录
  463. *
  464. * @return
  465. */
  466. public void addTranscodingLog(String tkey, String tkey_new) throws P2Exception {
  467. PaoSetRemote paoSetRemote = getP2ServerSystemPaoSet("TTRANSCODINGLOG", "tkey = '" + tkey + "'");
  468. if (paoSetRemote.isEmpty()) {
  469. PaoRemote paoRemote = paoSetRemote.addAtEnd();
  470. paoRemote.setValue("tkey", tkey, 11L);
  471. paoRemote.setValue("tkey_new", tkey_new, 11L);
  472. } else {
  473. PaoRemote paoRemote = paoSetRemote.getPao(0);
  474. paoRemote.setValue("tkey_new", tkey_new, 11L);
  475. }
  476. paoSetRemote.save();
  477. }
  478. /**
  479. * 获取OSS上传签名信息
  480. *
  481. * @return
  482. */
  483. public String getOssSignature() {
  484. String key = content.getString("key");
  485. // host的格式为 bucketname.endpoint
  486. String host = "https://" + BUCKE_NAME_1 + "." + END_POINT;
  487. // callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。
  488. // String callbackUrl = "http://88.88.88.88:8888";
  489. // 每一天产生一个文件夹
  490. // 用户上传文件时指定的前缀,如果是 / 则自动检测为文件夹。
  491. String dir = key;
  492. JSONObject jsonObject = new JSONObject();
  493. //过期时间 100 秒
  494. long expireTime = 600;
  495. long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
  496. Date expiration = new Date(expireEndTime);
  497. // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
  498. PolicyConditions policyConds = new PolicyConditions();
  499. policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, Long.MAX_VALUE);
  500. policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
  501. String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
  502. byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
  503. String encodedPolicy = BinaryUtil.toBase64String(binaryData);
  504. String postSignature = ossClient.calculatePostSignature(postPolicy);
  505. jsonObject.put("OSSAccessKeyId", AccessKey_ID);
  506. jsonObject.put("policy", encodedPolicy);
  507. jsonObject.put("signature", postSignature);
  508. jsonObject.put("dir", dir);
  509. jsonObject.put("host", host);
  510. jsonObject.put("expire", String.valueOf(expireEndTime / 1000));
  511. return getSucReturnObject().setData(jsonObject).toString();
  512. }
  513. }