前台传json数据,数据量太大时接口接收参数值为null

一般前端将数组数据传给后台接口时,需要转换成json。
但如果数据量太大,后台接口用String接收前端传过来的json数据会为null值。
这种情况下 前台可以将数据转成json后放入文件中,后台接口读取传过来的文件内容 然后进行解析。

代码如下

saveResult() {
    var content = JSON.stringify(this.resultList);
    var blob = new Blob([content], {type : 'text/plain;charset=utf-8'});
    let file = new File([blob], "test.json", {type: 'application/json',lastModified: Date.now()})

    var formData = new FormData();
    formData.append('file', file);

    $.ajax({
        url:`${config.baseUrl}/transaction/saveTransactionResultList`,
        type:'POST',
        data:formData,
        cache: false,
        processData: false,
        contentType: false,
        success:(res)=>{
            if(res.code){
            	layer.msg('保存成功');
            	console.log(res);
        	}
    	}
  	});
},
/**
  * 批量新增交易结果数据记录
  * @param file 交易结果数据 json
  * @return 成功或失败消息
  */
@RequestMapping(value = "/saveTransactionResultList", produces = "application/json;charset=utf-8")
public String saveTransactionResultList(MultipartFile file) {

    try {
        String fileContent = FileUtil.getFileContent(filePath);
        List<TransactionResult> transactionResultList = JSON.parseArray(fileContent,TransactionResult.class);

        // 数据量过大时会因为sql过长报异常 此处将超过2000条的数据分批存储 每次最多存储2000条。
        while (transactionResultList.size() > 0) {
        	if(transactionResultList.size() > 2000) {
            	List<TransactionResult> tempList = transactionResultList.subList(0, 2000);
                transactionResultService.saveTransactionResultList(tempList);
                transactionResultList.removeAll(tempList);
                continue;
            }
            transactionResultService.saveTransactionResultList(transactionResultList);
            break;
        }

        return Result.success().toJsonString();

	}catch (Exception e){
    	e.printStackTrace();
        //将异常信息写入日志
        LOGGER.error(FileUtil.getExceptionMsg(e));
        return Result.error("新增失败").toJsonString();
    }
}
	/**
     * 获取文件内容
     * 用于前端传来大量数据时 将数据字符串放入文件中再传到后台
     *
     * @param file 文件对象
     */
    public static String getFileContent(MultipartFile file) {
        StringBuilder result = new StringBuilder();
        try(Reader reader = new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8);
            BufferedReader br = new BufferedReader(reader)) {
            String line;
            while ((line = br.readLine()) != null) {
                // 一次读入一行数据
                if(StringUtils.isNotBlank(line)){
                    result.append(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result.toString();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值