如何选择任何类型的文件并将其上传到服务器?

时间:2018-12-30 08:26:52

标签: android file retrofit filepath filepicker

我正在尝试选择.pdf.doc之类的任何类型的文件,然后将其上载到带有retrofit库的服务器上。 我可以从文件中选择图像,视频和音乐,并将其轻松发送到服务器。但是在api 19及更高版本中,我无法直接访问其他文件!我这样尝试过:

    private InputStream getInputStreamForVirtualFile(Uri uri, String mimeTypeFilter)
        throws IOException {

    ContentResolver resolver = getContentResolver();

    String[] openableMimeTypes = resolver.getStreamTypes(uri, mimeTypeFilter);

    if (openableMimeTypes == null || openableMimeTypes.length < 1) {
        throw new FileNotFoundException();
    }

    return resolver
            .openTypedAssetFileDescriptor(uri, openableMimeTypes[0], null)
            .createInputStream();
}

这段代码给了我InputStream的文件,并且为了将它发送到服务器进行改造,我想创建一个文件副本,然后使用该文件发送它,我的代码是:

    private File getFile(Uri uri) throws IOException {
    String[] array = uri.getPath().split("/");
    File x = new File(Environment.getExternalStorageDirectory()+ "/" + array[array.length - 1]);
    FileOutputStream fileOutputStream = new FileOutputStream(x);
    InputStream inputStream = getInputStreamForVirtualFile(uri, "*/*");
    byte[] buffer = new byte[4096];
    int n = 0;
    while (-1 != (n = inputStream.read(buffer))) {
        fileOutputStream.write(buffer, 0, n);
    }
    inputStream.close();
    fileOutputStream.close();
    return x;
}

我还无法将其发送到服务器,但是android 8中的这些代码为我提供了正确的文件,但是在android 7中,我出现了此错误:

The requested MIME type is not supported.

我的问题是选择任何类型的文件并将其发送到经过改造的服务器的正确方法是什么?

如果我的方法是发送任何类型文件的合理方法,那么我该如何解决该问题以支持所有android系统(例如android 7)并修复我的错误!?

0 个答案:

没有答案