通过fetch从JS客户端发送图像到Java/Springboot服务器返回错误500

zfciruhq  于 2023-04-30  发布在  Spring
关注(0)|答案(1)|浏览(125)

我需要从web客户端(html+javascript)发送(上传)一个图像文件到服务器(java/springboot),然后存储它。
当然,在客户端,我创建了一个表单

<form action="" name="missionForm" method="post" enctype="multipart/form-data" novalidate>
  <fieldset>
    <div class="field">
      <label>
        <span style="font-weight:bold">Mission name</span>
    <input data-validate-length-range="3" name="name" id="name" required="required" />
      </label>
    </div>
    <div class="field">
      <label>
    <span>Mission image (png):</span>
    <input type='file' class='optional' name='loadImage' id='loadImage' accept='image/png'>
      </label>
    </div>
 </fieldset>
</form>

下面通过JavaScript读取表单,JavaScript通过fetch发送请求

document.forms[0].onsubmit = function(e){
    e.preventDefault();
   var imageFile = document.forms['missionForm']['loadImage'].files[0];
   
   const test = fetch(url+"/api/saveImage", {
    method: 'POST',
        body: imageFile,
    });
}

在服务器端(Java / Springboot),我在Controller类中创建了以下方法

@PostMapping(value="/api/saveImage")
public void saveImage(@RequestParam("file") MultipartFile multipartFile) throws SQLException{
     String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
     System.out.println("filename is "+fileName);   
}

当我启动它时,我在客户端上得到错误500。在服务器端,我得到以下错误“org”。SpringFrameworkweb.multipart.MultipartException:当前请求不是多部分请求”
我不明白为什么。有人能帮忙吗?我肯定我在这里错过了一些愚蠢的东西。谢谢!
我尝试在获取请求中“强制”content-type,但只得到了一个不同的错误

const test = fetch(url+"/api/saveImage", {
    method: 'POST',
        headers: {'Content-Type': 'multipart/form-data',},
        body: imageFile,
    });

错误是“org”。apache.tomcat.util.http.fileupload.FileUploadException:请求被拒绝,因为找不到多部分边界”

omhiaaxx

omhiaaxx1#

您应该使用表单数据。另外,在从客户端上传文件之前,您可以使用postman,并可以从中生成文件上传代码。代码如下:

var myHeaders = new Headers();

var formdata = new FormData();
formdata.append("file", fileInput.files[0], "<PATH>");

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: formdata,
  redirect: 'follow'
};

fetch("http://localhost:8082/api/file/upload", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));

Postman 示例:

相关问题