Android上传文件的全面解析

一、从Android上传文件到SpringBoot

在开发过程中,经常需要上传文件到后端服务器。这里介绍一种将Android文件上传到SpringBoot服务器的方法。主要过程如下:

1、在Android中选择文件

    private static final int FILE_SELECT_CODE = 1;

    private void showFileChooser() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        try {
            startActivityForResult(Intent.createChooser(intent, "请选择一个文件"), FILE_SELECT_CODE);
        } catch (android.content.ActivityNotFoundException ex) {
            // no file manager installed
        }
    }

2、在Android中上传文件

    if (resultCode == RESULT_OK) {
        if (requestCode == FILE_SELECT_CODE) {
            // Get the Uri of the selected file
            Uri uri = data.getData();
            String filePath = FileUtils.getPath(this, uri);
            Log.d(TAG, "file path:" + filePath);
            uploadFile(filePath);
        }
    }

    private void uploadFile(String filePath) {
        if (filePath == null) {
            Toast.makeText(this, "请选择文件", Toast.LENGTH_SHORT).show();
            return;
        }
        File file = new File(filePath);
        RequestBody fileBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), fileBody);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://localhost:8080/")//后端地址
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UploadService uploadService = retrofit.create(UploadService.class);
        Call<Result> resultCall = uploadService.uploadFile(body);
        resultCall.enqueue(new Callback<Result>() {
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
                Result result = response.body();
                if (result.isSuccess()) {
                    Toast.makeText(MainActivity.this, "上传成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, result.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {
                Toast.makeText(MainActivity.this, "上传失败", Toast.LENGTH_SHORT).show();
            }
        });
    }

3、后端使用SpringBoot接收文件

    @PostMapping("/uploadFile")
    public Result uploadFile(@RequestParam("file") MultipartFile file) {
        if (!file.isEmpty()) {
            String fileName = file.getOriginalFilename();
            String filePath = "d:/upload/";
            File dest = new File(filePath + fileName);
            try {
                file.transferTo(dest);
                return Result.success("上传成功");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return Result.fail("没有选择文件");
    }

二、Android上传文件控件

除了手动选择文件上传外,还可以使用第三方上传文件控件,例如百度云提供的开源控件BOSUploadFileSDK。

    compile 'com.baidu:bos-upload-sdk:1.0.3'
    //...

    BosUploadFileSDK.getInstance(this, AK, SK, endpoint, bucketName)
            .selectFileAndUpload(new OnUploadListener() {...});

三、Android文件选择和上传

一个通用的Android文件选择和上传示例:

    EditText filePathET;//显示文件路径的文本框
    Button chooseFileBT;//点击选择文件的按钮
    Button uploadBT;//点击上传按钮
    ProgressBar uploadPB;//显示上传进度

    String filePath;//上传文件的路径

    private void chooseFile() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        try {
            startActivityForResult(Intent.createChooser(intent, "请选择要上传的文件"), 1);
        } catch (ActivityNotFoundException ex) {
            showToast("请先安装一个文件管理程序");
        }
    }

    private void uploadFile() {
        if (filePath == null) {
            showToast("请选择要上传的文件");
            return;
        }
        File file = new File(filePath);
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UploadService uploadService = retrofit.create(UploadService.class);
        Call<Result> call = uploadService.uploadFile(body);
        call.enqueue(new Callback<Result>() {
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
                Result result = response.body();
                if (result != null && result.isSuccess()) {
                    showToast("上传成功");
                } else {
                    showToast("上传失败");
                }
            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {
                showToast("上传失败");
            }
        });
    }

四、Android上传文件源码和PHP源码

Android上传文件源码和后端PHP源码:

Android源码:

    private void uploadFile() {
        if (filePath == null) {
            showToast("请选择要上传的文件");
            return;
        }
        File file = new File(filePath);
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        UploadService uploadService = retrofit.create(UploadService.class);
        Call<Result> call = uploadService.uploadFile(body);
        call.enqueue(new Callback<Result>() {
            @Override
            public void onResponse(Call<Result> call, Response<Result> response) {
                Result result = response.body();
                if (result != null && result.isSuccess()) {
                    showToast("上传成功");
                } else {
                    showToast("上传失败");
                }
            }

            @Override
            public void onFailure(Call<Result> call, Throwable t) {
                showToast("上传失败");
            }
        });
    }

PHP源码:

    <?php
    $file=$_FILES['file'];
    $info=pathinfo($file['name']);
    $ext=$info['extension'];
    $types=array("jpg","png","gif","bmp");
    if(!in_array($ext,$types)){
        exit("格式错误,只支持后缀为jpg、png、gif、bmp的文件!");
    }
    $path="./uploads/".$file['name'];
    $tmp=$file['tmp_name'];
    move_uploaded_file($tmp,$path);//移动上传文件
    echo "上传成功!";
    ?>

五、Android和iOS传文件

Android和iOS传文件使用的是相同的协议,可以使用同一套代码来实现文件的上传和下载。

六、Android上传文件到服务器

上传文件到服务器需要先在Android客户端进行文件的选择和上传,并将文件流通过HTTP请求发送到服务器。服务器端则需要解析HTTP请求,及时接收并处理上传的文件。Android客户端使用Apache HttpClient发起请求,服务器端使用SpringBoot来接收请求并处理文件。

七、Android上传文件到云端

Android上传文件到云端,可以使用云存储服务,例如阿里云OSS、腾讯云COS等。

    // AliOSS示例代码
    private OSS oss;

    private void initOss(String endpoint, String accessKeyId, String accessKeySecret, String bucketName) {
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);
        ClientConfiguration configuration = new ClientConfiguration();
        configuration.setConnectionTimeout(15 * 1000);
        configuration.setSocketTimeout(15 * 1000);

        oss = new OSSClient(getApplicationContext(), endpoint, credentialProvider, configuration);
    }

    private void uploadToAliOSS(String objectKey, String filePath) {
        PutObjectRequest put = new PutObjectRequest(bucketName, objectKey, filePath);
        oss.asyncPutObject(put, new OSSCompletedCallback() {
            @Override
            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
                showToast("上传成功");
            }

            @Override
            public void onFailure(PutObjectRequest request, ClientException clientException, ServiceException serviceException) {
                showToast("上传失败");
            }
        });
    }

八、Android上传文件到仓库

Android上传文件到仓库,可以使用第三方仓库服务,例如MavenCentral仓库中的nexus-staging-maven-plugin插件。

    // Gradle示例代码
    apply plugin: 'maven-publish'

    publishing {
        publications {
            maven(MavenPublication) {
                groupId "com.example"
                artifactId "library"
                version "1.0.0"
                artifact("$buildDir/outputs/aar/library-release.aar")
            }
        }
        repositories {
            maven {
                url 'http://localhost:8081/repository/maven-releases/'
                credentials {
                    username 'admin'
                    password 'admin'
                }
            }
        }
    }

九、Android上传文件到OSS

Android上传文件到OSS,可以使用阿里云OSS提供的Java SDK。

    // Gradle示例代码
    implementation 'com.aliyun.oss:aliyun-sdk-oss:2.9.2'

    // Java示例代码
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    InputStream inputStream = new FileInputStream("local_file_path");
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
    PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);
    ossClient.shutdown();

十、亚马逊S3 Android上传文件

亚马逊S3 Android上传文件需要在Android客户端集成亚马逊提供的AWSService SDK。

    // Gradle示例代码
    implementation 'com.amazonaws:aws-android-sdk-s3:2.5.6'

    // Java示例代码
    AmazonS3 s3Client = new AmazonS3Client(new BasicAWSCredentials(accessKeyId, secretKey));
    s3Client.setRegion(Region.getRegion(Regions.fromName(region)));

    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, file);
    s3Client.putObject(putObjectRequest);

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/151247.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-11 13:40
下一篇 2024-11-11 13:40

相关推荐

  • Python应用程序的全面指南

    Python是一种功能强大而简单易学的编程语言,适用于多种应用场景。本篇文章将从多个方面介绍Python如何应用于开发应用程序。 一、Web应用程序 目前,基于Python的Web…

    编程 2025-04-29
  • Python zscore函数全面解析

    本文将介绍什么是zscore函数,它在数据分析中的作用以及如何使用Python实现zscore函数,为读者提供全面的指导。 一、zscore函数的概念 zscore函数是一种用于标…

    编程 2025-04-29
  • 全面解读数据属性r/w

    数据属性r/w是指数据属性的可读/可写性,它在程序设计中扮演着非常重要的角色。下面我们从多个方面对数据属性r/w进行详细的阐述。 一、r/w的概念 数据属性r/w即指数据属性的可读…

    编程 2025-04-29
  • Python计算机程序代码全面介绍

    本文将从多个方面对Python计算机程序代码进行详细介绍,包括基础语法、数据类型、控制语句、函数、模块及面向对象编程等。 一、基础语法 Python是一种解释型、面向对象、动态数据…

    编程 2025-04-29
  • Matlab二值图像全面解析

    本文将全面介绍Matlab二值图像的相关知识,包括二值图像的基本原理、如何对二值图像进行处理、如何从二值图像中提取信息等等。通过本文的学习,你将能够掌握Matlab二值图像的基本操…

    编程 2025-04-28
  • 疯狂Python讲义的全面掌握与实践

    本文将从多个方面对疯狂Python讲义进行详细的阐述,帮助读者全面了解Python编程,掌握疯狂Python讲义的实现方法。 一、Python基础语法 Python基础语法是学习P…

    编程 2025-04-28
  • 全面解析Python中的Variable

    Variable是Python中常见的一个概念,是我们在编程中经常用到的一个变量类型。Python是一门强类型语言,即每个变量都有一个对应的类型,不能无限制地进行类型间转换。在本篇…

    编程 2025-04-28
  • Zookeeper ACL 用户 anyone 全面解析

    本文将从以下几个方面对Zookeeper ACL中的用户anyone进行全面的解析,并为读者提供相关的示例代码。 一、anyone 的作用是什么? 在Zookeeper中,anyo…

    编程 2025-04-28
  • Python合集符号全面解析

    Python是一门非常流行的编程语言,在其语法中有一些特殊的符号被称作合集符号,这些符号在Python中起到非常重要的作用。本文将从多个方面对Python合集符号进行详细阐述,帮助…

    编程 2025-04-28
  • Switchlight的全面解析

    Switchlight是一个高效的轻量级Web框架,为开发者提供了简单易用的API和丰富的工具,可以快速构建Web应用程序。在本文中,我们将从多个方面阐述Switchlight的特…

    编程 2025-04-28

发表回复

登录后才能评论