Jquery实现跨域异步上传文件总结

下面是关于“Jquery实现跨域异步上传文件”的详细攻略。

什么是跨域及其实现原理

首先,我们要了解下什么是跨域(Cross-domain),顾名思义就是不同域名或不同端口之间的数据或请求传输。

在HTTP协议中,浏览器工作的原理是在同源策略(Same-Origin Policy)下,只能发送同一源下的请求(同一协议、同一IP地址、同一端口号),而不能跨域发送请求。这里的同一源是指:协议、域名、端口号都相同。

而要实现跨域,我们可以采用以下几种方式:

  1. JSONP跨域:利用script标签可以跨域引用资源的特性,在请求时添加callback参数,服务器端将处理好的数据包装在callback函数里返回给客户端,客户端就可以读取到数据。

  2. CORS跨域:现代浏览器支持HTML5规范中提出的跨源资源共享(Cross-Origin Resource Sharing,CORS)技术。通过在服务器端设置响应头Access-Control-Allow-Origin来告知浏览器哪些源可以访问资源。

  3. 代理跨域:在同一个域名下开发一个代理服务器,让这个代理服务器去请求需要跨域访问的资源,再把获取到的数据返回给前端。

Jquery实现跨域异步上传文件

如果我们需要在实现了跨域的情况下进行文件上传的话,我们就可以使用jquery的ajax方法配合FormData实现异步上传文件。

步骤如下:

1.构造FormData对象

我们在进行文件上传时,需要在提交表单数据的同时上传文件。FormData对象的作用就是帮我们构造表单数据,使之它成为可用于AJAX提交的数据。

var formData = new FormData();  // FormData对象初始化

formData.append('file', fileInput.files[0]);  // 添加一个文件将表单数据添加于formData中

2.使用Jquery ajax方法发送POST请求

Jquery ajax方法是ajax请求最常用的方式之一,我们可以利用ajax方法进行POST请求。

$.ajax({
    url: 'http://localhost:8080/upload',  // 请求地址
    type: 'POST',  // 请求类型
    data: formData,  // 请求数据
    cache: false,  // 不要缓存
    processData: false,  // 不要将数据处理成查询字符串
    contentType: false,  // 不要设置请求头

    success: function(res) {  // 请求成功回调
        console.log('上传成功!');
    },
    error: function(res) {  // 请求失败回调
        console.log('上传失败!');
    }
});

注意:远程服务器需要设置响应头Access-Control-Allow-Origin,才能接收到跨域请求。

示例1:使用CORS跨域上传文件

html代码:

<input type="file" id="fileInput"/>
<button onclick="uploadFile()">上传文件</button>

javascript代码:

function uploadFile() {
    var formData = new FormData();
    formData.append('file', fileInput.files[0]);

    $.ajax({
        url: 'http://localhost:8080/upload',  // 服务器地址
        type: 'POST',  // 请求类型
        data: formData,  // 请求数据
        xhrFields: {  // 跨域请求设置携带Cookie
            withCredentials: true
        },
        crossDomain: true,  // 开启跨域请求
        processData: false,  // 不要将数据处理成查询字符串
        contentType: false,  // 不要设置请求头

        success: function(data) {  // 成功回调
            console.log('上传成功:', data);
        },
        error: function() {  // 失败回调
            console.log('上传失败!');
        }
    });
}

Java代码:

@RestController
public class UploadController {
    @PostMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) throws Exception {
        try (
            InputStream in = file.getInputStream();
            FileOutputStream out = new FileOutputStream("D:/image/" + file.getOriginalFilename());
        ) {
            byte[] buffer = new byte[4096];
            int len = 0;
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            return "上传成功";
        } catch (Exception e) {
            throw new Exception("上传失败:" + e.getMessage());
        }
    }
}

在该例子中,使用了CORS(Cross-Origin Resource Sharing)技术实现跨域上传。前端使用jquery的ajax方法进行POST请求,同时设置crossDomain和xhrFields,携带Cookie进行请求;后端在处理请求时设置响应头Access-Control-Allow-Origin为"*",表示允许任何请求源进行跨域访问。

示例2:使用JSONP跨域上传文件

html代码:

<input type="file" id="fileInput"/>
<button onclick="uploadFile()">上传文件</button>

javascript代码:

function uploadFile() {
    var formData = new FormData();
    formData.append('file', fileInput.files[0]);

    $.ajax({
        url: 'http://localhost:8080/upload',  // 服务器地址
        type: 'POST',  // 请求类型
        data: formData,  // 请求数据
        dataType: 'jsonp',  // JSONP跨域
        jsonp: 'callback',  // 指定callback参数名
        jsonpCallback: 'handleResponse',  // 指定回调函数名
        processData: false,  // 不要将数据处理成查询字符串
        contentType: false,  // 不要设置请求头

        success: function(data) {  // 成功回调
            console.log('上传成功:', data);
        },
        error: function() {  // 失败回调
            console.log('上传失败!');
        }
    });
}

function handleResponse(response) {  // 定义回调函数
    console.log(response);
}

Java代码:

@RestController
public class UploadController {
    @RequestMapping(value = "/upload", produces = "application/javascript;charset=UTF-8")
    public String upload(@RequestParam("file") MultipartFile file, String callback) throws Exception {
        try (
            InputStream in = file.getInputStream();
            FileOutputStream out = new FileOutputStream("D:/image/" + file.getOriginalFilename());
        ) {
            byte[] buffer = new byte[4096];
            int len = 0;
            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }
            return callback + "({\"message\":\"上传成功\"})";
        } catch (Exception e) {
            throw new Exception("上传失败:" + e.getMessage());
        }
    }
}

在该例子中,使用了JSONP(JSON with Padding)技术实现跨域上传。前端使用jquery的ajax方法进行POST请求,同时设置dataType为jsonp,指定callback参数名和回调函数名;后端在处理请求时将返回结果处理成jsonp格式,将结果包含在回调函数名称中返回到前端。

总结

由于浏览器同源策略的限制,跨域请求在前端开发中是非常常见的情况。在实现文件上传时,我们可以使用jquery的ajax方法配合FormData实现跨域异步上传文件,针对不同的跨域实现方式可以做出相应的调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Jquery实现跨域异步上传文件总结 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • json传值以及ajax接收详解

    JSON传值以及AJAX接收详解 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于前端与后端之间传递数据。在Web 开发中,通过AJAX方式向后端发送请求,也需要把数据以JSON格式发送过去,在后端处理完后再把结果以JSON格式返回前端,前端再解析成对象使用。本文将为您详细讲解JSON传值以及AJAX接收的过…

    jquery 2023年5月28日
    00
  • jQWidgets jqxDateTimeInput clearString属性

    以下是关于“jQWidgets jqxDateTimeInput clearString属性”的完整攻略,包含两个示例说明: 简介 jqxDateTimeInput 控件的 clearString 属性用于设置日期时间输入框的清除按钮文本。 完整攻略 以下是 jqxDateTimeInput 控件 clearString 属性的完整攻略。 定义 clearS…

    jquery 2023年5月11日
    00
  • 如何在HTML输入文本字段内放置一个响应的清除按钮

    要在HTML输入文本字段内放置一个响应的清除按钮,可以使用HTML5的内置特性——“清除按钮”属性(clear button),它可以让文本框内的文本值在被点击后被清除。 以下是使用 “清除按钮”属性实现在HTML输入文本字段内放置一个清除按钮的步骤: 在HTML代码中找到需要添加清除按钮的输入文本字段。 在输入文本字段的标签中添加“type=’text’”…

    jquery 2023年5月12日
    00
  • jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)

    jQuery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)攻略 背景介绍 在网页制作中,拖拽效果其实是一种很常见的交互方式,比如拖拽图片上传等,使用jQuery可以轻松实现这种效果。然而,在实际开发中我们需要考虑的是兼容性问题,本攻略将为大家介绍如何使用jQuery实现简单的拖拽效果,并兼容所有主流浏览器。 实现步骤 HTML结构 首先,我们需要在HTM…

    jquery 2023年5月28日
    00
  • jQuery UI的Droppable hoverClass选项

    当使用jQuery UI的Droppable插件时,hoverClass选项可用于设置drop区域的悬停时的样式。 语法 可以通过hoverClass选项来设置drop区域悬停时的样式: $( ".droppable" ).droppable({ hoverClass: "highlight" }); 参数说明 hov…

    jquery 2023年5月12日
    00
  • jQuery常用的4种加载方式分析 原创

    jQuery常用的4种加载方式分析 前言 在前端开发中,jQuery 是一个常用的 JavaScript 库,它能够简化 JavaScript 编程的复杂度,提升开发效率。本文主要介绍 jQuery 的四种常用加载方式,以及它们的优缺点分析。 1. 直接引入 jQuery 开发人员可以直接在 HTML 文件中引入 jQuery,代码如下: <scrip…

    jquery 2023年5月28日
    00
  • jQuery Mobile Listview hideDividers 选项

    jQuery Mobile Listview提供了hideDividers选项,用于控制在列表视图中是否隐藏分隔符。在本文中,我们将详细解释hideDividers选项的用法和示例说明。 概述 hideDividers选项是jQuery Mobile Listview的一个属性,它用于指定是否隐藏列表视图中的分隔符。分隔符通常用于把列表中的项目分成多个部分,…

    jquery 2023年5月12日
    00
  • jQuery height()、innerHeight()、outerHeight()函数的区别详解

    下面是关于jQuery height()、innerHeight()、outerHeight()函数的区别详解: 1. height函数 height()函数是jQuery用于获取或设置元素的高度的函数。它返回的是元素的内容高度,不包括边框、内边距和外边距。如果参数为空,该函数返回第一个匹配元素的高度。如果参数为一个函数,则该函数用于计算每一个匹配元素的高度…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部