【问题标题】:Problems with axios, Spring boot and base64axios、Spring boot 和 base64 的问题
【发布时间】:2018-12-20 04:00:12
【问题描述】:

我正在尝试从我的 react native 应用程序到我的 Spring Boot 应用程序发布一个帖子,但我收到了这个错误:

java.lang.IllegalArgumentException: 非法 base64 字符 a

反应原生代码:

axios({
    method: 'post',
    url: 'myip',
    data: {
      teste: photo.image.base64,
    },
    headers: {'content-type': 'application/json'},
  }) 
  .then(function (response) {
    console.log("works");
  })
  .catch(function (error) {
    console.log(error);
  });

Spring 引导代码

@RequestMapping(value = "/", method = RequestMethod.POST)
public Map<String, String> upload (@RequestBody Map<String, String> payload) {
    byte[] imageByte;
    String encodedString = payload.get("teste");
    String fileName = (new Date()).toString();
    fileName = fileName.replace(' ', '_');
    fileName = fileName.replace(':', '_');

    try {
        imageByte = Base64.getDecoder().decode(encodedString.toString());
        FileUtils.writeByteArrayToFile(new File(fileName + ".png"), imageByte);
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("error");
    }
    return response;
}

编辑: 堆栈跟踪 -

 java.lang.IllegalArgumentException: Illegal base64 character a
        at java.util.Base64$Decoder.decode0(Unknown Source)
        at java.util.Base64$Decoder.decode(Unknown Source)
        at java.util.Base64$Decoder.decode(Unknown Source)
        at com.pac.upload.UploadController.login(UploadController.java:33)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)

我看不到我错过了什么。任何人都可以帮助我吗?提前致谢!

【问题讨论】:

  • 你能显示堆栈跟踪吗?
  • Eugen,我用堆栈跟踪编辑了帖子
  • 异常在方法 at com.pac.upload.UploadController.login(UploadController.java:33) 下。 photo.image.base64下面的文字怎么样?
  • 你可以在这里检查你的文字是否正确:base64decode.org
  • 尝试将consumes 参数添加到您的@RequestMapping 注释并指出这是application/json,与请求匹配。 (否则,如果 Spring 无法自动确定内容协商,它将回退到 POST 的默认值,即 base64 编码的键值对。)请参阅journaldev.com/3358/…

标签: java spring-boot react-native base64 axios


【解决方案1】:

这是我使用 Axios 上传图片的示例。

服务器:

@PostMapping("/{businessId}/gallery")
    public Object singleImageUpload(@RequestParam("newImage") MultipartFile file) {
        if (file.isEmpty()) {
            return new GeneralResponse(ErrorsEnum.INVALID_IMAGE);
        }
        try {
            Business business = getUserBusinessLogged();
            byte[] bytes = file.getBytes();

            ...

            return new GeneralResponse(ErrorsEnum.OK);
        } catch (IOException e) {
            log.log(Level.SEVERE, "Error saving file", e);
            return new GeneralResponse(ErrorsEnum.SAVE_FAILED, "Problems saving file.");
        } catch (ControlledException ex) {
            return new GeneralResponse(ErrorsEnum.SAVE_FAILED, ex.getMessage());
        }
    }

Axios 客户端:

const postGalleryImageRequest = async (sessionToken, businessId, image) => {
    const data = new FormData();
    data.append('newImage', image);
    const result = await api.post('business/' + businessId + '/gallery', data, {
        headers: { 
            Authorization: sessionToken,
            'Content-Type': 'multipart/form-data',
        }
    })  .then((response) => {
            return response.data
        })
        .catch(error => {
             ....
        })
    return result;
}

Axios 设置:

import axios from 'axios';

export const baseUrl = 'https://host:port/api/';

export default
   axios.create({
      baseURL: baseUrl,
      timeout: 30000
   });

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 2019-03-25
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2016-11-11
    相关资源
    最近更新 更多