Android上传文件到服务器共分两步: 1、打开手机文件管理,选择文件 2、将选择的文件上传到服务器 下面将一步一步进行讲解。 # 1、打开手机文件管理,选择文件 ## 1.1. 选择一种类型的文件 打开文件的方式是通过Intent打开,例如打开选择图片、打开选择视频、选择pdf文件。 在项目中,经常遇到需要选择指定类型的文件,指定一种类型的文件我们一般使用`setType()`来实现过滤,如下面代码的`setType()`的使用 ```java //选择图片 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*");//表示显示所有格式的图像 若换成:"image/png"则只能选择png格式的图片 startActivityForResult(intent, 101); //选择视频 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("video/*");//表示显示所有格式的视频 startActivityForResult(intent, 101); //选择pdf文件 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("application/pdf");//只显示pdf文件 intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, 101); ``` 若你只需要一种类型的文件,那么上面的例子就可以满足你了,根据需要的类型,设置`setType()`,传入对应的类型值,Android的中常用的类型值参考:[Android中常用mimeType表](https://www.miaokee.com/524059.html "Android中常用mimeType表")。 ## 1.2. 同时指定多种类型的文件 但如果要指定多种类型,如:同时指定 pdf,excel,word,ppt 这些类型的文件,就不能使用上面的方式了。 例子:同时指定 pdf,excel,word,ppt 类型的文件 ```java //打开文件夹选择文件 public void openDirChooseFile() { String[] mimeTypes = {MimeType.DOC, MimeType.DOCX, MimeType.PDF, MimeType.PPT, MimeType.PPTX, MimeType.XLS, MimeType.XLSX, MimeType.TXT}; Intent intent = new Intent(Intent.ACTION_GET_CONTENT); if (mimeTypes != null) { // Intent指定多种类型的文件,正确的做法,是通过Intent.EXTRA_MIME_TYPES传递Mime类型数组实现 intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); } intent.setType("*/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, 101); } /** MimeType文件 * @author Armyone * @date 2018/11/21 10:56 * @desc */ public class MimeType { public static final String DOC = "application/msword"; public static final String DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; public static final String XLS = "application/vnd.ms-excel application/x-excel"; public static final String XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; public static final String PPT = "application/vnd.ms-powerpoint"; public static final String PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation"; public static final String PDF = "application/pdf"; public static final String TXT = "text/plain"; } ``` Activity代码: ```java public class Test1Activity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test1); Button btn = findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { openDirChooseFile(); } }); } } ``` 到这里打开管理器选择文件的功能就完成了。 # 2、将选择的文件上传到服务器 这里本人使用的是Retrofit进行的网络请求。 retrofit 接口配置: ```java //接口 注意要使用 @Multipart注解,传入的文件需要是:MultipartBody.Part @Multipart @POST("/api/file/Uploade") Observable> upload(@Part MultipartBody.Part file); ``` Activity代码,上传到服务器: ```java @RequiresApi(api = Build.VERSION_CODES.Q) @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.i(TAG, "onActivityResult: "+data.getData()); if (requestCode == 101){ //获取到选择的文件,并上传 File file = uriToFileApiQ(data.getData()); RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/from-data"), file); MultipartBody.Part body = MultipartBody.Part.createFormData("file", file.getName(), requestFile); mPresenter.upload(body);//执行retrofit网络请求 } } //uri转file @RequiresApi(api = Build.VERSION_CODES.Q) public File uriToFileApiQ(Uri uri) { File file = null; if (uri == null) return file; //android10以上转换 if (uri.getScheme().equals(ContentResolver.SCHEME_FILE)) { file = new File(uri.getPath()); } else if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) { //把文件复制到沙盒目录 ContentResolver contentResolver = getContentResolver(); String displayName = System.currentTimeMillis() + Math.round((Math.random() + 1) * 1000) + "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(contentResolver.getType(uri)); try { InputStream is = contentResolver.openInputStream(uri); File cache = new File(getCacheDir().getAbsolutePath(), displayName); FileOutputStream fos = new FileOutputStream(cache); FileUtils.copy(is, fos); file = cache; fos.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } return file; } ``` 参考: [android设置过滤文件类型,Android之Intent筛选多种类型文件](http://www.zztongyun.com/article/android%E6%98%BE%E7%A4%BApdf "android设置过滤文件类型,Android之Intent筛选多种类型文件") [Android中常用mimeType表](https://www.miaokee.com/524059.html "Android中常用mimeType表") [Android Uri转File方法(适配android 10以上版本及android 10以下版本)](https://blog.csdn.net/Mr_Gaojinchao/article/details/124772272 "Android Uri转File方法(适配android 10以上版本及android 10以下版本)") 最后编辑:2023年03月10日 ©著作权归作者所有
最新回复