要上传文件需要发送一个特定类型的请求,使用 http 这个包提供的东西发送上传文件的请求,需要新建一个 MultipartRequest。
打开 app_service.dart,在这个 ApiHttpClient 里面可以定义一个新的方法,返回的值的类型Future
再添一个参数,required int postId,这个 postId 表示的是文件所属的内容的 id ,请求服务端上传文件用的接口的时候可以设置一下文件相关的一个内容,所以会用到这个内容的 id 。
在这个方法里先准备一下文件上传接口的地址,声明一个 uri,值是用 Uri.parse 处理一下文件上传接口的地址,先是 AppConfig,选择导入这个 AppConfig,用一下它里面的 apiBaseUrl,然后是 /files,再加上一个 post 查询符,值是 postId 参数的值。
下面声明一个请求,名字是 request,新建一个 http.MultipartRequest ,请求用的 HTTP 方法设置成 POST,请求的地址是上面准备好的 uri 。
上传文件要验证用户身份,所以要在请求头部里添加一个头部数据,request.headers.putIfAbsent,头部的名字是 Authorization,用一个方法返回它的值,Bearer 空格,后面加上 $token 的值。
在这个请求里要添加需要上传的文件,声明一个 multipartFile,值可以是 await,用一下 http.MultipartFile.fromPath 这个构造方法创建一个这样的文件,字段的名字是'file' ,这个名字是服务端应用规定好的,然后是文件的地址,这里是 file.path,再设置一下文件的类型,contentType,值是一个 MediaType,第一个参数设置成 image,第二个参数是 file.extension ?? 'jpg' 。
要使用这个 MediaType 需要再导入一个包,在文件顶部,导入 package:http_parser/http_parser.dart 。
准备好要上传的文件,再执行一下 request.files.add,把上面准备好的 multipartFile 交给这个方法,意思就是在这个 request 的 files 里面添加一个要上传的文件。
最后可以 return 执行 request.send() 这个方法得到的结果。