Flutter dio3.x上传文件(图片)具体实现

Dio3.0上传文件具体使用如下:

void uploadPhoto(File file) async{
   
    String path = file.path;
    var name = path.substring(path.lastIndexOf("/") + 1, path.length);
    String imageType = name.substring(name.lastIndexOf(".") + 1, name.length);
    var image = await MultipartFile.fromFile(
        path,
        filename: name,
    );
    print("文件路径="+path);
    print("文件名="+name);
    print("文件image=$image");
    FormData formData = FormData.fromMap({
   
      "image": image
    });
    asyncRequestNetwork<Map>(
      Method.post,
      url: HttpConstants.UPDATE_USER_PHOTO,
      params: formData,
      isList: false,
      isShow: true,
      onSuccess: (data){
   
        if(data != null) {
   
          String url = data["URL"];
          view.provider.setUserPhoto(url);
          UserInfoBean userInfoBean = Provider.of<UserProvider>(view.context).user;
          print("provider==="+userInfoBean.phone);
          userInfoBean.photoURI = url;
          Provider.of<UserProvider>(view.context).saveUser(userInfoBean);
        }
      },
    );
  }

封装dio请求dio_utils.dart

class DioUtils {
   

  static final DioUtils _singleton = DioUtils._internal();

  static DioUtils get instance => DioUtils();

  factory DioUtils() {
   
    return _singleton;
  }

  static Dio _dio;

  Dio getDio(){
   
    return _dio;
  }

  DioUtils._internal(){
   
    var options = BaseOptions(
      connectTimeout: 15000,
      receiveTimeout: 15000,
      responseType: ResponseType.plain,
      validateStatus: (status){
   
        // 不使用http状态码判断状态,使用AdapterInterceptor来处理(适用于标准REST风格)
        return true;
      },
    );
    _dio = Dio(options);
    /// Fiddler抓包代理配置 https://www.jianshu.com/p/d831b1f7c45b
//    (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
//        (HttpClient client) {
   
//      client.findProxy = (uri) {
   
//        //proxy all request to localhost:8888
//        return "PROXY 10.41.0.132:8888";
//      };
//      client.badCertificateCallback =
//          (X509Certificate cert, String host, int port) => true;
//    };
    /// 统一添加身份验证请求头
    _dio.interceptors.add(AuthInterceptor());
    /// 打印Log(生产模式去除)
    if (!Constant.inProduction){
   
      _dio.interceptors.add(LoggingInterceptor());
    }
    /// 适配数据(根据自己的数据结构,可自行选择添加)
    _dio.interceptors.add(AdapterInterceptor());
    ///cookie
    _dio.interceptors.add(CookieManager(
        PersistCookieJar(dir:StorageManager.cookieDirectory.path+"/.cookies/")));
  }

  // 数据返回格式统一,统一处理异常
  Future<BaseEntity<T>> _request<T>(String method, String url, {
   
    dynamic data, Map<String, dynamic> queryParameters,
    CancelToken cancelToken, Options options
  }) async {
   
    var response = await _dio.
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Flutter中使用Dio库进行文件上传可以通过以下步骤实现: 首先,确保已经在项目的`pubspec.yaml`文件中添加了Dio库的依赖: ```yaml dependencies: dio: ^4.0.0 ``` 然后,在需要上传文件的地方引入Dio库: ```dart import 'package:dio/dio.dart'; ``` 接下来,创建一个Dio的实例并配置它: ```dart var dio = Dio(); ``` 然后,使用Dio的`FormData`类来创建一个表单数据对象,并添加需要上传文件: ```dart FormData formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(file.path, filename: 'upload.jpg'), }); ``` 这里的`file`是一个`File`对象,表示需要上传文件。 最后,使用Dio的`post`方法发送请求,并将表单数据作为参数传递给它: ```dart Response response = await dio.post( 'https://example.com/upload', data: formData, ); ``` 这里的`https://example.com/upload`是上传文件的接口地址,你需要替换为实际的地址。 完整的示例代码如下: ```dart import 'dart:io'; import 'package:dio/dio.dart'; void main() async { var dio = Dio(); File file = File('path/to/file.jpg'); FormData formData = FormData.fromMap({ 'file': await MultipartFile.fromFile(file.path, filename: 'upload.jpg'), }); Response response = await dio.post( 'https://example.com/upload', data: formData, ); print(response.data); } ``` 通过以上步骤,你就可以使用Dio库在Flutter上传文件了。记得根据实际情况修改代码中的文件路径和上传接口地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值