Dart 服务端开发 文件上传 原

clent端使用angular组件

upload_component.html

form id="myForm" method="POST" enctype="multipart/form-data">
    <input type="file" name="fileData"> <!-- file field -->
</form>
<span>{{progress}}</span>
<button  (click)="upload()">上传</button>

upload_component.dart

import 'package:angular/angular.dart';
import 'package:angular_forms/angular_forms.dart';
import "dart:html";
@Component(
  selector: 'upload',
  templateUrl: 'upload_component.html',
  styleUrls: const ['upload_component.css'],
  directives: const [CORE_DIRECTIVES,formDirectives],
)
class UploadComponent{
 //表示文件上传进度
  String progress;

  void upload(){
     // formDate 表示用于存储html文件表单字段的对象    
   var formData = new FormData(querySelector("#myForm"));

   final request = new HttpRequest();
  //使用post方法
   request.open('POST', 'http://localhost:8080/upload');
   //监听文件上传进度
   request.upload.onProgress.listen((ProgressEvent e) {
     progress = (e.loaded*100/e.total).toInt().toString() + '%';
   });
   //监听文件上传完成时调用
   request.onLoad.listen((e) {
     print('Uploaded'+request.response);

   });
   
   request.send(formData);
  }

}

server端

import 'dart:io';

import 'package:mime/mime.dart';
import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_cors/shelf_cors.dart';
import 'package:shelf_rest/shelf_rest.dart';

void main() {
  var rootRouter = router()..post('/upload',(Request request) async{

  print(request.headers);
  var header = HeaderValue.parse(request.headers['content-type']);
  await for(MimeMultipart part in request.read().transform(new MimeMultipartTransformer(header.parameters['boundary']))) {
  if(part.headers.containsKey('content-disposition')) {
  header = HeaderValue.parse(part.headers['content-disposition']);
  String filename = header.parameters['filename'];
  final file = new File(filename);
  IOSink fileSink = file.openWrite();
  await part.pipe(fileSink);
  fileSink.close();
  }
  }

  return new Response.ok("Success",headers:{'Access-Control-Allow-Origin':'*'});
  });
    //通过此中间件设置跨域标头信息
  final cors = createCorsHeadersMiddleware(
      corsHeaders: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Expose-Headers': 'Authorization, Content-Type',
        'Access-Control-Allow-Headers': 'Authorization, Origin, X-Requested-With, Content-Type, Accept',
        'Access-Control-Allow-Methods': 'GET, POST, PUT, PATCH, DELETE'
      }
  );

  var handler = const Pipeline()
      .addMiddleware(logRequests())
      .addMiddleware(cors)  
      .addHandler(rootRouter.handler);

  printRoutes(rootRouter);

  io.serve(handler, 'localhost', 8080).then((server) {
    print('Serving at http://${server.address.host}:${server.port}');
  });
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏禹都一只猫博客

Linux 性能检测常用的 10 个基本命令

1752
来自专栏三流程序员的挣扎

Android 优化——内存优化

在 GC 的过程中,其它在工作的线程会暂停,包括负责绘制的 UI 线程,并且在不同区域的内存释放速度也有一定的差异,但不管在哪个区域,都要到这次 GC 内存回收...

2911
来自专栏Google Dart

Flutter 构建完整应用手册-联网 顶

从大多数应用程序获取互联网上的数据是必要的。 幸运的是,Dart和Flutter为这类工作提供了工具!

1342
来自专栏比原链

Derek解读Bytom源码-P2P网络 地址簿

Gitee地址:https://gitee.com/BytomBlockchain/bytom

881
来自专栏积累沉淀

CXF 框架拦截器

CXF的拦截器 •为什么设计拦截器? 1.为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. •拦截器分类: 1...

2016
来自专栏移动端开发

NSURLSession 所有的都在这里(一)

5603
来自专栏张善友的专栏

领悟Web设计模式

摘要 本文介绍了在.NET框架下应用Web设计模式改进WebForm程序设计的一些基本方法及要点。 关键字 设计模式,ASP.NET,WebForm,MVC,P...

2135
来自专栏Android知识点总结

SpringBoot-12-之Ajax跨域访问全解析

3582
来自专栏向治洪

butternife Zelezny自动注入插件

插件地址:http://plugins.jetbrains.com/plugin/7369 Products: IntelliJ IDEA, RubyMine...

1928
来自专栏技术博文

excel导入与导出

基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已。修改这种文件后再保存...

3066

扫码关注云+社区

领取腾讯云代金券