使用ajax跨域调用springboot框架的api传输文件

所属分类: 网络编程 / AJAX相关 阅读数: 1222
收藏 0 赞 0 分享

在新项目中使用的是springboot编写的api,涉及到ajax跨域请求和传输文件的问题,在这里记录一下
首先是前台页面的代码

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>test_api</title>
  <script type="text/javascript" src="jquery-1.7.2.js"></script>
  <script type="text/javascript">
   function test(){
    var obj = new Object;
    obj.name = $("#name").val();
    obj.age = $("#age").val();
    var file = document.getElementById("file").files[0];
    var formData = new FormData();
    formData.append("data",JSON.stringify(obj));
    formData.append("file",file);
    $.ajax({
     type:"post",
     url:"http://localhost:8187/test/upload",
     contentType:false,
     processData:false,
     data:formData,
     success:function(data){
       alert(data.msg);
     }
    });
   }
  </script>
 </head>
 <body>
  <div class="">
   <table>
    <tr>
     <td>sCompany:</td>
     <td><input type="text" id="name" value="tom" /></td>
    </tr>
    <tr>
     <td>scardtype:</td>
     <td><input type="text" id="age" value="23" /></td>
    </tr>
    <tr>
     <td>file:</td>
     <td><input type="file" id="file" /></td>
    </tr>
   </table>
   <input type="button" onclick="test();" value="提交" />
  </div>
 </body>
</html>

程序入口类的代码

package test;

import javax.servlet.MultipartConfigElement;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Hello world!
 *
 */

@SpringBootApplication
public class App 
{

  public static void main( String[] args )
  {
    SpringApplication.run(App.class, args);
  }
  //设置ajax跨域请求
  @Bean
  public WebMvcConfigurer corsConfigurer(){
    return new WebMvcConfigurerAdapter(){

      @Override
      public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
      }
    };
  }

  @Bean
  public MultipartConfigElement multipartConfigElement(){
    MultipartConfigFactory factory = new MultipartConfigFactory();
    //设置上传文件大小限制
    factory.setMaxFileSize("10MB");
    //设置上传总数据大小
    factory.setMaxRequestSize("15MB");
    return factory.createMultipartConfig();
  }
}

api代码

package test.controller;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import test.model.UploadInfo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

@RestController
@RequestMapping("/test")
public class TestController {

  /**
   * 上传文件
   * @param req form请求
   * @return json字符串
   */
  @RequestMapping(value="/upload", method=RequestMethod.POST)
  public String uploadFile(HttpServletRequest req){ 
    // 返回结果用 json对象
    JSONObject returnObj = new JSONObject();
    //从请求中获取请求的json字符串
    String strData = req.getParameter("data");
    //将获取到的JSON字符串转换为Imgidx对象
    UploadInfo info = JSON.parseObject(strData, UploadInfo.class);
    //获取上传的文件集合
    List<MultipartFile> files = ((MultipartHttpServletRequest)req).getFiles("file");
    MultipartFile file = files.get(0);
    // 返回信息头部
    Map<String, String> header = new HashMap<String, String>();
    header.put("code", "0");
    header.put("msg", "success");
    File file1234 = new File(file.getOriginalFilename());
    //插入数据的影响的数据条数
    int result = 0;
    //将文件上传到save
    if(!file.isEmpty()){
      try{
        byte[] arr = new byte[1024];
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file1234));
        bos.write(arr);
        bos.flush();
        bos.close();
      }catch(Exception e){
        header.put("code", "-1");
        header.put("msg", "errorMsg:" + e.getMessage());
      }
    }else{
      header.put("code", "-1");
      header.put("msg", "errorMsg:上传文件失败,因为文件是空的");
    }
    String returnStr = returnObj.toJSONString(header);
    return returnStr;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

理解jquery ajax中的datatype属性选项值

jquery中ajax的dataType属性用于指定服务器返回的数据类型,如果不指定,jQuery 将自动根据HTTP包MIME信息来智能判断,如果datatype选项不填写的话,会将返回的数据当成字符串处理。
收藏 0 赞 0 分享

基于Jquery ajax技术实现间隔N秒向某页面传值

这篇文章给大家介绍jquery ajax技术实现每隔一段时间向某页面传值,以及setinterval()方法的语法介绍,对本文感兴趣的朋友可以参考下
收藏 0 赞 0 分享

通过Ajax两种方式讲解Struts2接收数组表单的方法

使用struts2表单传值,可以传一个或者是作为一个对象的各个属性传,都非常灵活便捷。但是如果我们需要传一个数组并希望struts正确接收,该怎么处理呢?接下来,通过本文给大家介绍通过Ajax两种方式讲解Struts2接收数组表单的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Jquery.history解决ajax的前进后退问题

本文主要给大家介绍基于Jquery.history解决ajax的前进后退问题,涉及到jquery前进后退相关方面的知识,本文内容经典,非常具有参考价值,特此把jquery前进后退相关知识分享在脚本之家网站供大家参考
收藏 0 赞 0 分享

使用HTML5中postMessage知识点解决Ajax中POST跨域问题

这篇文章主要介绍了使用HTML5中postMessage知识点解决Ajax中POST跨域问题的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

谈谈你对aja的理解(一、二)

Ajax是Asynchronous Javascript And XML的缩写,其作用通过Ajax可以使用Javascript语句来调用XMLHttpRequest对象,直接与服务器进行通讯,可以在不重载页面的情况下与服务器交换数据。
收藏 0 赞 0 分享

关于ajax对象一些常用属性、事件和方法大小写比较常见的问题总结

最近比较空闲,于是抽个时间整理些关于ajax方法的东东。在项目中经常发现ajax板块好多问题都是属性,方法,事件大小写不区分问题,最终导致了程序运行出现麻烦,下面给大家介绍关于ajax对象一些常用属性、事件和方法大小写比较常见的问题总结
收藏 0 赞 0 分享

Ajax请求session失效该如何解决

HTML + Servlet + Filter + jQuery 一般来说我们的项目都有登录过滤器,一般请求足以搞定。但是AJAX却是例外的,所以解决方法是设置响应为session失效。
收藏 0 赞 0 分享

编写轻量ajax组件02--浅析AjaxPro

ajaxpro虽然是一个比较老的组件,不过实现思想和源码还是很有借鉴价值的。接下来通过本篇文章给大家介绍编写轻量ajax组件02--浅析AjaxPro,感兴趣的朋友可以参考下
收藏 0 赞 0 分享

编写轻量ajax组件01-与webform平台上的各种实现方式比较

这篇文章主要介绍了编写轻量ajax组件01-与webform平台上的各种实现方式比较,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多