flutter app untuk unitstock
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

248 regels
7.8 KiB

  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'dart:typed_data';
  5. import 'package:http/io_client.dart';
  6. import 'package:path_provider/path_provider.dart';
  7. import 'package:http/http.dart';
  8. import 'package:unitstocks/Util/Prefs.dart';
  9. import '../main.dart';
  10. import 'package:oauth2/oauth2.dart' as oauth2;
  11. class file_Trans_Handler {
  12. // double _progress = 0;
  13. String _path = '';
  14. StreamSubscription dlulStream;
  15. String _error = '';
  16. get path => _path;
  17. get error => _error;
  18. StreamController _progress = new StreamController<double>();
  19. Stream<double> get progress =>_progress.stream;
  20. bool useLocal = false;
  21. var httpClient;
  22. downloadFile(String fileName,String link) async {
  23. StreamedResponse _response;
  24. List<int> _bytes = [];
  25. int _total = 0;
  26. httpClient = await util.getOauth2Client();
  27. print('Start Download');
  28. _progress.add(null);
  29. try {
  30. Request req = new Request('GET', Uri.parse(link));
  31. // req.headers = '';
  32. _response = await httpClient.send(req).timeout(
  33. Duration(seconds: 20));
  34. // _response = await client.get('$link',headers: 'application/json')
  35. if(_response.statusCode==200){
  36. _total = _response.contentLength?? int.parse(_response.headers['file-size']);
  37. }
  38. // print('${_total / 1024} KB');
  39. _error = '';
  40. dlulStream = _response.stream.listen((value) {
  41. if(_response.statusCode==200){
  42. _bytes.addAll(value);
  43. _progress.add(((_bytes.length / _total)));
  44. }
  45. else{
  46. String resString = utf8.decode(value);
  47. if(util.htmlErrorTitle(resString)!=""){
  48. _error = util.htmlErrorTitle(resString);
  49. }
  50. _error = resString;
  51. }
  52. })
  53. ..onDone(() async {
  54. if(_error==''){
  55. _progress.add(0.0);
  56. print('Finish Download');
  57. final file = File(
  58. "${(await getApplicationDocumentsDirectory()).path}/$fileName");
  59. await file.writeAsBytes(_bytes);
  60. _path = file.path;
  61. }
  62. else{
  63. print('Error Download, $_error');
  64. _progress.add(-1.0);
  65. }
  66. })
  67. ..onError((e) async {
  68. print('Error Download, $e');
  69. _progress.add(-1.0);
  70. _error = e.toString();
  71. });
  72. }
  73. on HandshakeException catch(e){
  74. if(useLocal){
  75. print('Error Download, $e');
  76. _progress.add(-1.0);
  77. _error = e.toString();
  78. }
  79. else{
  80. useLocal = true;
  81. http = IOClient(HttpClient(context: clientContext));
  82. await downloadFile(fileName,link);
  83. }
  84. }
  85. catch(e){
  86. print('Error Download, $e');
  87. _progress.add(-1.0);
  88. _error = e.toString();
  89. }
  90. }
  91. uploadFile(String fileName,String link,String company,String cabang_id) async{
  92. httpClient = await util.getOauth2Client();
  93. oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
  94. final file = File(
  95. "${(await getApplicationDocumentsDirectory()).path}/$fileName");
  96. String mimeType = 'application/vnd.sqlite3';
  97. if(file.existsSync()){
  98. Uint8List byte = file.readAsBytesSync();
  99. // print("file size ${file.lengthSync()/1024}");
  100. try{
  101. var _response = await httpClient.put(
  102. Uri.parse(link), headers: {"cabangId":cabang_id,"company":company,'Content-type': mimeType,'Authorization':'Bearer ${tokenRestData.accessToken}'},
  103. body: byte);
  104. print('File send ${file.lengthSync()/1024} KB');
  105. if(_response.statusCode!=200){
  106. if(util.htmlErrorTitle(_response.body.toString())!=""){
  107. return {"STATUS":0,"DATA":util.htmlErrorTitle(_response.body.toString())};
  108. }
  109. throw _response.body.toString();
  110. }
  111. final Map data = JsonDecoder().convert(_response.body);
  112. // print(_response.body);
  113. // if(data['STATUS']==1){
  114. // return {"STATUS":1,"DATA":'File send ${file.lengthSync()/1024} KB'};
  115. // }
  116. // else {
  117. return data;
  118. // }
  119. }
  120. on HandshakeException catch(e){
  121. if(useLocal){
  122. return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'};
  123. }
  124. else{
  125. useLocal = true;
  126. http = IOClient(HttpClient(context: clientContext));
  127. return await uploadFile( fileName, link, company, cabang_id);
  128. }
  129. }
  130. catch(e){
  131. print(e);
  132. return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'};
  133. }
  134. }
  135. else{
  136. return {"STATUS":0,"DATA":'No such file'};
  137. }
  138. }
  139. unPackDb(String link,String company,String cabang_id,String dbPath) async{
  140. try{
  141. var _response = await http.post(
  142. Uri.parse(link), headers: {'Content-type': 'application/json'},
  143. body: json.encode({"cabangId":cabang_id,"company":company,"dbPath":dbPath}));
  144. final Map data = JsonDecoder().convert(_response.body);
  145. return data;
  146. }
  147. on HandshakeException catch(e){
  148. if(useLocal){
  149. return {"STATUS":0,"DATA":'Upload timeout. Make sure server is up and running'};
  150. }
  151. else{
  152. useLocal = true;
  153. http = IOClient(HttpClient(context: clientContext));
  154. return await unPackDb( link, company, cabang_id, dbPath);
  155. }
  156. }
  157. catch(e){
  158. print(e);
  159. return {"STATUS":0,"DATA":'Upload timeout. Make sure server is up and running'};
  160. }
  161. }
  162. submitDb(String link,String company,String stock_id) async{
  163. try{
  164. var _response = await http.post(
  165. Uri.parse(link), headers: {'Content-type': 'application/json'},
  166. body: json.encode({"stockTakingId":stock_id,"company":company}));
  167. final Map data = JsonDecoder().convert(_response.body);
  168. return data;
  169. }
  170. on HandshakeException catch(e){
  171. if(useLocal){
  172. return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'};
  173. }
  174. else{
  175. useLocal = true;
  176. http = IOClient(HttpClient(context: clientContext));
  177. return await submitDb(link,company,stock_id);
  178. }
  179. }
  180. catch(e){
  181. print(e);
  182. return {"STATUS":0,"DATA":'Request timeout. Make sure server is up and running'};
  183. }
  184. }
  185. // apex rest blm support multipart
  186. uploadMultipart(String fileName,String link)async{
  187. httpClient = await util.getOauth2Client();
  188. StreamedResponse _response;
  189. List<int> _bytes = [];
  190. int _total = 0;
  191. try{
  192. var request = MultipartRequest('PUT', Uri.parse(link));
  193. request.files.add(
  194. await MultipartFile.fromPath(
  195. 'picture',
  196. "${(await getApplicationDocumentsDirectory()).path}/$fileName"
  197. )
  198. );
  199. _response = await httpClient.send(request);
  200. _total = File("${(await getApplicationDocumentsDirectory()).path}/$fileName").lengthSync();
  201. dlulStream = _response.stream.listen((value) {
  202. _bytes.addAll(value);
  203. print('upload ${_bytes.length/_total}');
  204. _progress.add(((_bytes.length / _total)));
  205. })
  206. ..onDone(() async {
  207. _progress.add(0.0);
  208. print('Finish Download');
  209. final file = File(
  210. "${(await getApplicationDocumentsDirectory()).path}/$fileName");
  211. await file.writeAsBytes(_bytes);
  212. _path = file.path;
  213. })
  214. ..onError((e) async {
  215. print('Error Download, $e');
  216. _progress.add(-1.0);
  217. _error = e.toString();
  218. });
  219. }
  220. on HandshakeException catch(e){
  221. if(useLocal){
  222. print('Error Download, $e');
  223. _progress.add(-1.0);
  224. _error = e.toString();
  225. }
  226. else{
  227. useLocal = true;
  228. http = IOClient(HttpClient(context: clientContext));
  229. await uploadMultipart(fileName,link);
  230. }
  231. }
  232. }
  233. cancel()async{
  234. http?.close();
  235. await dlulStream?.cancel();
  236. _progress?.close();
  237. }
  238. }