java - axios、Spring boot 和 base64 的问题

标签 java spring-boot react-native base64 axios

我正在尝试从我的 React Native 应用程序向我的 Spring Boot 应用程序发送帖子,但收到此错误:

java.lang.IllegalArgumentException: Illegal base64 character a

react native 代码:

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)

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

最佳答案

这是我使用 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
   });

关于java - axios、Spring boot 和 base64 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53862246/

相关文章:

java - 生成介于 0 和某个值之间的随机整数,其中一半在集合 (0,5] 中,另一半在 (5,x]

java - 如何组合相互依赖的 Observables 并获得一个包含每个值的对象?

java - Spring获取数据库路径时出错

java - 在 Spring 中禁用 CSRF 验证

java - 未找到测试 - 使用 JUnit5 时 [在 IntelliJ IDEA 中]

javascript - React-native 在设备上崩溃;致命信号 6 (SIGABRT)

react-native - 任务 ':app:processDebugResources' 执行失败。 > 安卓资源链接失败可以再构建RN安卓版

java - 使用 updatetable=false 更新实体中的字段会返回具有新值字段的实体

java - 选择 Java 时让按钮闪烁

javascript - react-native-webview 加载本地 HTML 文件但得到纯文本