Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SpringMVC中的Ajax PostFormData抛出异常_Javascript_Java_Ajax_Spring Mvc - Fatal编程技术网

Javascript SpringMVC中的Ajax PostFormData抛出异常

Javascript SpringMVC中的Ajax PostFormData抛出异常,javascript,java,ajax,spring-mvc,Javascript,Java,Ajax,Spring Mvc,昨天我遇到了一个类似的问题,Ajax POST方法返回了405个错误,这是由csrf令牌引起的。有人帮了我,但现在我对发生的事无能为力 我有一个Ajax POST请求: $(document).ready(function(){ var mic, recorder, soundFile; setup(); }) function setup() { mic = new p5.AudioIn(); mic.start(); recorder = new p5.Sou

昨天我遇到了一个类似的问题,Ajax POST方法返回了405个错误,这是由csrf令牌引起的。有人帮了我,但现在我对发生的事无能为力

我有一个Ajax POST请求:

$(document).ready(function(){
    var mic, recorder, soundFile;
    setup();
})


function setup() {
  mic = new p5.AudioIn();
  mic.start();
  recorder = new p5.SoundRecorder();
  recorder.setInput(mic);
  soundFile = new p5.SoundFile();
}

function toggleRecording(e) {
    if (e.classList.contains("recording")) {
        recorder.stop();    
        e.classList.remove("recording"); 
        sendAudioToServer(soundFile)
    } else {
        e.classList.add("recording");
        recorder.record(soundFile);
    }
}

function sendAudioToServer(soundFile)
{
    var data = new FormData();
    data.append('file', soundFile);
    $.ajax({
        method: 'POST',
        enctype: 'multipart/form-data',
        url: '/recognizeCommand',
        data: data,
        processData: false,
        contentType: false,
        success: function(data) {
          alert("works!");
        },    
        error: function(xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    })
}
soundFile是p5.js库中包含音频的对象。我也尝试使用简单字符串,但也有相同的错误

以及Spring MVC中的控制器:

@RequestMapping(value = "/recognizeCommand", method = RequestMethod.POST)
    public @ResponseBody String recognizeCommand(@RequestParam("file") MultipartFile multipartFile) {
        try {
            SpeechRecognitionApplication.logger.info("BEFORE: " + multipartFile);
            byte[] bytes = multipartFile.getBytes();
            SpeechRecognitionApplication.logger.info(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "finish";
    }
当我发送这个Ajax请求时,它抛出错误400,并且在Spring中出现异常:

org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:199) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:112) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124) ~[spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131) [spring-web-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877) [spring-webmvc-5.0.5.RELEASE.jar:5.0.5.RELEASE]
重要的是,当我用postman测试端点并发送一些文件作为参数时,它工作正常

我知道在这个论坛上也有类似的帖子,但我认真地检查了每一篇,尝试了每一种解决方案,没有什么能帮上忙。 我相信你们中的一些人会知道如何解决这个问题

编辑 在ajax post方法之前添加了这3行:

data.append('file', "example");
console.log("file: " + data.get("file"));
console.log(data);
返回:


我想问题不在于spring控制器,而在于文件传递到请求的方式。若要确保文件已传递,您可以登录到浏览器以检查文件是否存在:

console.log(“文件”+data.get(“文件”)

您能展示一下从输入中获取文件的代码吗

编辑: 你能用这个简单的文件上传表来测试你的端点吗


函数handleFileSelect(){
var data=new FormData();
输入=document.getElementById('fileinput');
data.append('file',input.files[0]);
console.log(“file”+data.get(“file”);
$.ajax({
方法:“POST”,
enctype:“多部分/表单数据”,
网址:'http://localhost:8080/test/recognizeCommand',
数据:数据,
processData:false,
contentType:false,
成功:功能(数据){
警惕(“工作!”);
},
错误:函数(xhr、ajaxOptions、thrownError){
警报(xhr.状态);
警报(thrownError);
}
});
}

您将收到此异常

org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
如果你看你代码的这一部分

public @ResponseBody String recognizeCommand(@RequestParam("file") MultipartFile multipartFile)
您正在使用@RequestParam,因此必须将代码更改为

@RequestMapping(value = "/recognizeCommand", method = RequestMethod.POST, consumes = { "multipart/form-data" })
public @ResponseBody String recognizeCommand(@RequestPart("file") MultipartFile multipartFile) {

它应该会起作用

我相信你的问题在于contentType=false;当我删除它时,状态为500:org.springframework.web.multipart.MultipartException:Current request不是一个多部分请求我尝试了使用ajax参数的所有组合,但都无效。声音文件的类型是什么。p5.SoundFile();它返回:文件[object]请用我编辑的答案测试它。用yoursso替换url问题在于p5.SoundFile(),它可能不是有效的多部分文件。您的后端工作正常,因此我必须找到其他库或深入检查文档以找到解决方案可能soundFile不是有效的多部分文件,请尝试使用其他文件如果我将简单字符串传递给FormData,这是相同的问题仍然是相同的问题您无法在多部分中传递简单字符串,您必须使用类似的东西。。。append('test',新Blob([“HELLO!!!”],{type:“text/plain”}))。。。。我认为您的文件不是有效的多部分文件