Axios Jquery文件上传
DanceDonkey 人气:0Jquery上传
jquery文件时,后端好像并没有经过SpringMVC处理,没有被封装成一个MultiPartFIle对象,可通过原生的Servlet API request.getInputStream()获取。至于为什么没被SpringMVC封装成MultipartFile对象目前还没有研究透彻。可能是请求内容类型没有设置成 multipart/form-data。下面是jquery上传文件的代码示例,文件名,文件大小等参数可通过拼在url后面使用request.getParameter()获取。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <script src="jquery.js"></script> <script src="axios.js"></script> <body> 请上传图片:<input type="file" name="file" id="file" onchange="fileChange(this)"> <br> <button onclick="jqueryUpload()">jquery提交</button> </body> <script> var file = undefined function fileChange(data){ file = data.files[0] } function jqueryUpload(){ $.ajax({ url:"/jqueryUpload?filename=test.jpg", type:"post", data:file, contentType:false, processData:false, success(res){ console.log('上传结果' + res) } }) } </script> </html>
@PostMapping("jqueryUpload") public String jqueryUpload(HttpServletRequest request, MultipartFile file) throws Exception{ System.out.println(file); String fileDesc = "D:\\2022\\" + request.getParameter("filename"); FileOutputStream outputStream = new FileOutputStream(fileDesc); ServletInputStream inputStream = request.getInputStream(); byte[] bytes = new byte[1024]; int line = inputStream.read(bytes); while (line != -1){ outputStream.write(bytes,0,line); line = inputStream.read(bytes); } inputStream.close(); outputStream.close(); return "success"; }
此时后台打印的multipartfile是null。后续会深入研究·······…
Axios上传
axios上传不同于jquery,axios将上传的二进制数据和其他参数封装在了FormData对象中,值得注意的是,此时的内容类型要改为multipart/form-data。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <script src="jquery.js"></script> <script src="axios.js"></script> <body> 请上传图片:<input type="file" name="file" id="file" onchange="fileChange(this)"> <br> <button onclick="jqueryUpload()">jquery提交</button> <button onclick="axiosUpload()">axios提交</button> </body> <script> var file = undefined function fileChange(data){ file = data.files[0] } function axiosUpload(){ var formData = new FormData(); formData.append("file",file); formData.append("filename","myfile.jpg") axios.post("/axiosUpload",formData,{ headers:{ "Content-Type" : "multipart/form-data" } }).then(res => { console.log('上传结果' + res) }) } </script> </html>
@PostMapping("axiosUpload") public String axiosUpload(HttpServletRequest request,MultipartFile file)throws Exception{ InputStream inputStream = file.getInputStream(); String fileDesc = "D:\\2022\\" + request.getParameter("filename"); FileOutputStream os = new FileOutputStream(fileDesc); byte[] bytes = new byte[1024]; int line = inputStream.read(bytes); while (line != -1){ os.write(bytes,0,line); line = inputStream.read(bytes); } inputStream.close(); os.close(); return "success"; }
感觉还是更喜欢axios这种,明确指定了内容类型并且经过了SpringMVC处理。
加载全部内容