【问题标题】:html file upload using multipart retrofit使用多部分改造的html文件上传
【发布时间】:2018-12-20 10:17:59
【问题描述】:

我想使用改造多部分上传 html 文件。但它会抛出错误代码 422。我在下面创建多部分。

@NonNull
    private MultipartBody.Part prepareFilePart(File file, Context context) {

        // create RequestBody instance from file
        RequestBody requestFile =
                RequestBody.create(
                        MediaType.parse("text/*"), file);


        // MultipartBody.Part is used to send also the actual file name
        return MultipartBody.Part.createFormData("file", file.getName(), requestFile);
    }

我尝试过媒体类型 =“text/*”、“text/plain”、“text/html”、“multipart/form-data”和 context.getContentResolver().getType(Uri.parse(file.getAbsolutePath) ()))。 我做错了什么?

【问题讨论】:

    标签: android retrofit multipartform-data


    【解决方案1】:

    使用 MimeTypeMap.getFileExtensionFromUrl(String url) 获取 mime 类型。这将返回给定 url 的文件扩展名,如果没有扩展名,则返回一个空字符串。 在下面找到完整的代码。

     @NonNull
        public MultipartBody.Part prepareFilePart(Context context, String partName, Uri fileUri) {
            // create RequestBody instance from file
    
            File file = FileUtils.getFile(context, fileUri);
            InputStream inputStream = null;
            byte[] imageBytes = new byte[0];
            try {
                inputStream = context.getContentResolver().openInputStream(fileUri);
                imageBytes = FileUtils.getBytes(inputStream, inputStream.available());
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            RequestBody requestFile = RequestBody.create(MediaType.parse(getMimeType(file)), imageBytes);
            // MultipartBody.Part is used to send also the actual file name
            return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
        }
    
            public static String getMimeType(File file) {
                String extension = null;
                //Check uri format to avoid null
                if (file != null)
                    extension = MimeTypeMap.getFileExtensionFromUrl(file.getPath());
    
                return extension;
            }
    
    public static File getFile(Context context, Uri uri) {
            if (uri != null) {
                String path = getPath(context, uri);
                if (path != null && isLocal(path)) {
                    return new File(path);
                }
            }
            return null;
        }
    
    public static String getPath(final Context context, final Uri uri) {
    
            if (DEBUG)
                Log.d(TAG + " File -",
                        "Authority: " + uri.getAuthority() +
                                ", Fragment: " + uri.getFragment() +
                                ", Port: " + uri.getPort() +
                                ", Query: " + uri.getQuery() +
                                ", Scheme: " + uri.getScheme() +
                                ", Host: " + uri.getHost() +
                                ", Segments: " + uri.getPathSegments().toString()
                );
    
            final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    
            // DocumentProvider
            if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
                // LocalStorageProvider
                if (isLocalStorageDocument(uri)) {
                    // The path is the id
                    return DocumentsContract.getDocumentId(uri);
                }
                // ExternalStorageProvider
                else if (isExternalStorageDocument(uri)) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];
    
                    if ("primary".equalsIgnoreCase(type)) {
                        return Environment.getExternalStorageDirectory() + "/" + split[1];
                    }
    
                }
                // DownloadsProvider
                else if (isDownloadsDocument(uri)) {
    
                    final String id = DocumentsContract.getDocumentId(uri);
                    final Uri contentUri = ContentUris.withAppendedId(
                            Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
    
                    return getDataColumn(context, contentUri, null, null);
                }
                // MediaProvider
                else if (isMediaDocument(uri)) {
                    final String docId = DocumentsContract.getDocumentId(uri);
                    final String[] split = docId.split(":");
                    final String type = split[0];
    
                    Uri contentUri = null;
                    if ("image".equals(type)) {
                        contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                    } else if ("video".equals(type)) {
                        contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                    } else if ("audio".equals(type)) {
                        contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                    }
    
                    final String selection = "_id=?";
                    final String[] selectionArgs = new String[]{
                            split[1]
                    };
                    return getDataColumn(context, contentUri, selection, selectionArgs);
                }
            }
            // MediaStore (and general)
            else if ("content".equalsIgnoreCase(uri.getScheme())) {
    
                // Return the remote address
                if (isGooglePhotosUri(uri))
                    return uri.getLastPathSegment();
                else if (isFieProviderUri(uri))
                    return uri.getPath();
    
                return getDataColumn(context, uri, null, null);
            }
            // File
            else if ("file".equalsIgnoreCase(uri.getScheme())) {
                return uri.getPath();
            }
    
            return null;
        }
    
    /**
         * @param uri The Uri to check.
         */
        public static boolean isLocalStorageDocument(Uri uri) {
            return AUTHORITY.equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is ExternalStorageProvider.
         */
        public static boolean isExternalStorageDocument(Uri uri) {
            return "com.android.externalstorage.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is DownloadsProvider.
         */
        public static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is MediaProvider.
         * @author paulburke
         */
        public static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is Google Photos.
         */
        public static boolean isGooglePhotosUri(Uri uri) {
            return "com.google.android.apps.photos.content".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is Google Photos.
         */
        public static boolean isFieProviderUri(Uri uri) {
            return Constants.FILE_AUTHORITY.equals(uri.getAuthority());
        }
    
        /**
         * Get the value of the data column for this Uri. This is useful for
         * MediaStore Uris, and other file-based ContentProviders.
         *
         * @param context       The context.
         * @param uri           The Uri to query.
         * @param selection     (Optional) Filter used in the query.
         * @param selectionArgs (Optional) Selection arguments used in the query.
         * @return The value of the _data column, which is typically a file path.
         * @author paulburke
         */
        public static String getDataColumn(Context context, Uri uri, String selection,
                                           String[] selectionArgs) {
            Log.w(TAG, uri.toString());
    
            Cursor cursor = null;
            final String column = MediaStore.Images.ImageColumns.DATA;
            final String[] projection = {
                    column
            };
    
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                        null);
                if (cursor != null && cursor.moveToFirst()) {
                    if (DEBUG)
                        DatabaseUtils.dumpCursor(cursor);
    
                    final int column_index = cursor.getColumnIndexOrThrow(column);
                    return cursor.getString(column_index);
                }
            } finally {
                if (cursor != null)
                    cursor.close();
            }
            return null;
        }
    

    【讨论】:

    • 什么是 FileUtils?可以分享一下吗?
    • 我仍然无法解析 getBytes() 、 isLocal() 方法。以及“AUTHORITY”.equals(uri.getAuthority()) 和“Constants”.FILE_AUTHORITY.equals(uri.getAuthority()) 的重要内容。可以分享一下吗?
    • 将 FILE_AUTHORITY 替换为您在清单文件中使用“android.support.v4.content.FileProvider”提供者添加的文件提供者权限,并且权限为“android.provider.ContactsContract.AUTHORITY”
    猜你喜欢
    • 2018-04-15
    • 2016-04-10
    • 1970-01-01
    • 2021-11-17
    • 2015-05-02
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多