上传包含多个文件的 JSON 数组

Posted

技术标签:

【中文标题】上传包含多个文件的 JSON 数组【英文标题】:Uploading a JSON array with multiple files 【发布时间】:2019-06-22 08:24:28 【问题描述】:

我有以下需要上传的 json:

["key":"value","key1":"value1",
["innerkey":"innervalue","filename":"name","innerkey":"innervalue","filename":"name"]]

JsonArray里面的两个innerkey有两个文件需要上传。

我正在使用 okhttp multipart 上传它们。

一个普通字段被添加为

multipart.addFormDataPart(key, value);

一个文件被添加为

 multipart.addFormDataPart("filename", "image.jpeg", RequestBody.create(MediaType.parse("image/jpeg"), new File(path)));

我之前上传了一个非嵌套的 json,方法是将 json 转换为 hashmap 并使用 for 循环添加部分

 MultipartBody.Builder multipart = new MultipartBody.Builder();
        for (Map.Entry<String, String> entry : data.entrySet()) 
            String key = entry.getKey();
            String value = entry.getValue();
            if(!key.equals("filePath"))
                multipart.addFormDataPart(key, value);

            else

                String filename = "";
                String type = MyUtility.getMimeType(key);
                filename = key.substring(key.lastIndexOf("/") + 1);
                multipart.addFormDataPart("fileName", filename, RequestBody.create(MediaType.parse(type), new File(key)));
            
        

新结构似乎很难处理,我该怎么做?

【问题讨论】:

您好,您想上传多个具有一定价值的文件。对吗? 是的,但它带有嵌套的 json 我认为在 MultiPart POST 方法中不可能实现这种所需的格式,想象一下如何使用 postman app 共享此类数据。一种解决方案是将 文件数据 作为 Base64 编码字符串 并使用原始请求正文传递整个数据。 检查这个答案***.com/a/35866301/10271334,这可能对你的情况有所帮助。 我认为这是一个失败的原因,任何人都可以看看这个问题,如果社区规则没问题,如果有人也回答这个问题,我愿意给予赏金。 ***.com/questions/54529577/… 【参考方案1】:

请告诉我你正在寻找这样的东西

    public static Map<String,String> convertToMap(Object yourJsonArrayOrJsonObject) throws Exception
    
        HashMap<String, String> map = new HashMap<>();
        processJSON(null, yourJsonArrayOrJsonObject, map);
        return map;
    

    private static void processJSON(String jsonKey, Object jsonItem, Map<String, String> map)
    
        if (jsonItem instanceof JSONArray)
        
            JSONArray array = (JSONArray) jsonItem;
            for (Object arrayItem : array)
            
                processJSON(null, arrayItem, map);
            
         else if (jsonItem instanceof JSONObject)
        
            JSONObject json = (JSONObject) jsonItem;
            Set<String> keys = json.keySet();
            for (String key : keys)
            
                processJSON(key, json.get(key), map);
            
         else
        
            map.put(jsonKey, String.valueOf(jsonItem));
        
    

【讨论】:

以上是关于上传包含多个文件的 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 上传多个文件

如何将文件与包含有关文件的附加信息的对象的 json 一起上传?

如何在 javascript 中使用表单数据上传大型 JSON 对象?

上传多个文件 userfile[] 数组?

使用JavaScript将具有数组的JSON文件上传到不同的选项卡中

无法使用 Alamofire 从数组上传多个文件