前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AJAX的post请求与上传文件

AJAX的post请求与上传文件

作者头像
端碗吹水
发布于 2020-09-23 04:26:07
发布于 2020-09-23 04:26:07
3.5K00
代码可运行
举报
运行总次数:0
代码可运行

AJAX的post请求

之前介绍了AJAX的get的请求方式与跨域请求,除此之外AJAX还可以进行异步的post请求,在使用post方式的请求时需要设置请求头,如下:

xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

如果没有设置请求头信息的话,服务端是接收不到post数据的。

以下示例简单演示如何提交post表单数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<script>
    function createCORSRequest(method, url) {
        var xhr = new XMLHttpRequest();
        if ("withCredentials" in xhr) {
            xhr.open(method, url, true);
            // 设置请求头信息
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        } else if (typeof XDmainRequest != "undefined") { //兼容IE
            xhr = new XDmainRequest();
            xhr.open(method, url, true);
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        } else {
            xhr = null;
        }
        return xhr;
    }

    function sendCode() {
        var request = createCORSRequest('post', 'send');
        if (request) {
            request.onload=function () {
                if(request.responseText){
                    // 显示服务端响应的数据
                    alert(request.responseText);
                }else{
                    alert("服务端没有响应数据!");
                }
            };
            // 发送post表单数据
            request.send("phone="+telNumber.value);
        }
    }
</script>
<body>
    <input type="text" name="phone" id="telNumber" placeholder="手机号码" />
    <button type="button" onclick="sendCode()">发送</button>
</body>
</html>

服务端代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/send")
public class SendCodeServlet extends HttpServlet {

    protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        System.out.println("手机号码是:" + httpServletRequest.getParameter("phone"));

        httpServletResponse.setContentType("text/html;charset=UTF-8");
        PrintWriter printWriter = httpServletResponse.getWriter();
        printWriter.print("服务器已收到");
    }
}

服务端控制台打印结果:

手机号码是:1234567899

客户端显示响应数据:

通过AJAX上传文件

上面我们演示了使用AJAX提交post表单数据,那么上传文件的请求方式也是post,以下示例演示简单的使用AJAX做一个带有进度条的文件上传。 页面代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<script>
    function createCORSRequest(method, url) {
        var xhr = new XMLHttpRequest();
        if ("withCredentials" in xhr) {
            xhr.open(method, url, true);
        } else if (typeof XDmainRequest != "undefined") { //兼容IE
            xhr = new XDmainRequest();
            xhr.open(method, url, true);
        } else {
            xhr = null;
        }
        return xhr;
    }

    function upload() {
        // 表单数据对象
        var formData = new FormData();
        // 多个文件需要进行逐个遍历
        for (var i = 0; i < document.getElementById("files").files.length; i++) {
            // 将文件数据添加到表单数据中
            formData.append("files", document.getElementById("files").files[i]);
        }
        var request = createCORSRequest('post', 'upload');
        if (request) {
            request.onload = function () {
                if (request.responseText == "1") {
                    alert("上传成功!");
                } else {
                    alert("上传失败!");
                }
            };
            // 给进度条添加监听事件,这样才有进度条的效果
            request.upload.addEventListener("progress", progressChange, false)

            // 上传表单数据
            request.send(formData);
        }
    }

    // 改变进度条
    function progressChange(event) {
        progress1.max = event.total;  // 数据的总大小
        progress1.value = event.loaded;  // 当前已上传的大小
    }

</script>
<body>
    <input type="file" id="files" name="fileUpload" multiple="multiple"/>
    <button type="button" name="button" onclick="upload()">上传</button>
    <br><br>
    <progress id="progress1"></progress>
</body>
</html>

服务端代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {

    protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        PrintWriter printWriter = httpServletResponse.getWriter();
        // 设置临时文件的保存路径
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        diskFileItemFactory.setRepository(new File("D:/"));

        // 实例化文件上传对象
        ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
        servletFileUpload.setHeaderEncoding("UTF-8");

        // 文件的保存路径
        File savePath = new File(this.getServletContext().getRealPath("/uploadDir"));
        System.out.println(savePath.getPath());
        try {
            // 拿出请求数据
            List<FileItem> fileItems = servletFileUpload.parseRequest(httpServletRequest);
            for (FileItem fileItem : fileItems) {
                // 过滤表单字段
                if (!fileItem.isFormField()) {
                    //兼容IE,IE传过来的是路径,需要截取出文件名
                    String fileName=fileItem.getName();
                    if (fileName.indexOf("\\") >= 0) {
                        System.out.println(fileName);
                        fileName=fileName.substring(fileName.lastIndexOf("\\"),fileName.length());
                    }
                    // 写入文件到保存路径中
                    FileUtils.copyInputStreamToFile(fileItem.getInputStream(), new File(savePath, fileName));
                }
            }

        } catch (FileUploadException e) {
            // 上传失败响应0
            printWriter.print("0");
            e.printStackTrace();
        }

        // 上传成功响应1
        printWriter.print("1");
    }
}

运行效果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/12/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
高通发布第三代骁龙7:GPU性能大涨50%,配备骁龙8系同款三ISP
此次高通发布的第三代骁龙7,采用了台积电4nm制程工艺,CPU为4大核+4小核设计,由1个2.63 GHz核心、3个2.40 GHz核心和4个1.80 GHz核心组成。官方表示,其CPU性能相比第一代骁龙7提升了15%。
芯智讯
2023/11/20
8700
高通发布第三代骁龙7:GPU性能大涨50%,配备骁龙8系同款三ISP
华为麒麟 970 发布,超越高通骁龙 835 了吗?
今日(9 月 2 日)晚间,华为在德国 IFA 2017 大会上正式发布了新一代麒麟 970 芯片。 配置 麒麟 970 采用了台积电 10 nm 工艺,包含 55 亿晶体管(骁龙 835 是 31 亿颗,苹果 A10 是 33 亿颗),功耗降低了 20%。 CPU 部分变化不大,依旧采用 8 核心设计,4xA73 2.4GHz + 4xA53 1.8GHz。GPU 则升级到了 Mali-G72 MP12(12核心),与上一代相比,图形处理性能提升20%,能效提升50%。 基带部分,麒麟 9
AI科技大本营
2018/04/26
1.1K0
华为麒麟 970 发布,超越高通骁龙 835 了吗?
骁龙最强AI芯能力下放:小旗舰8s发布,端侧运行10B大模型,小米Civi首发
但AI性能丝毫不减:支持100亿参数大模型端侧运行,是骁龙8Gen 3同款配置。可运行Baichuan-7B,Google Gemini Nano、Llama2和ChatGLM等模型。
量子位
2024/03/20
1770
骁龙最强AI芯能力下放:小旗舰8s发布,端侧运行10B大模型,小米Civi首发
支持百亿参数大模型、卢伟冰现场官宣小米首发,高通骁龙8s Gen3发布
3 月 18 日,高通正式推出了第三代骁龙 8s 移动平台(骁龙 8s Gen3),凭借旗舰级的 CPU、GPU 和 AI 性能,全方位支持了强大的终端侧生成式 AI 功能、始终感知的 ISP、超沉浸的移动游戏体验、突破性连接能力和无损高清音频。
机器之心
2024/03/19
1930
支持百亿参数大模型、卢伟冰现场官宣小米首发,高通骁龙8s Gen3发布
高通骁龙8+转投台积电!4nm制程整体功耗降15%,小米OPPO旗舰都安排上了
萧箫 发自 凹非寺 量子位 | 公众号 QbitAI 终于,高通的最新芯片又回归台积电工艺了! 就在刚刚,高通在发布会上宣布了全新的移动平台第一代骁龙8+和第一代骁龙7,其中骁龙8+终于从三星4nm回归台积电4nm制程。 工艺一换,功耗立刻就不一样了。 虽然八核的配置并没有什么改变,但相比骁龙8,骁龙8+不仅在CPU和GPU功耗上分别降低了30%,CPU性能还提升了10%左右。 有意思的是,这次高通在发布会上,还主动公开了在骁龙8+上运行原神的功耗数据: 除此之外,高通这次也发布了一款三星4nm制程的骁
量子位
2022/05/23
3520
高通骁龙8+转投台积电!4nm制程整体功耗降15%,小米OPPO旗舰都安排上了
首发二代骁龙7+平台,Redmi Note 12 Turbo定价1999元起!传联发科天玑8000/9000系列迭代芯片被砍
3月28日,小米集团旗下子品牌Redmi召开春季新品发布会,正式发布了Redmi Note 12 Turbo,主打大内存+大存储(8+256起步),并首发高通第二代骁龙7+处理器,定价竟然低至1999元起,堪称“价格屠夫”。此外Redmi还宣布与华纳兄弟探索集团合作,带来了全球首款哈利·波特定制手机——Note 12 Turbo哈利·波特版。
芯智讯
2023/04/11
6660
首发二代骁龙7+平台,Redmi Note 12 Turbo定价1999元起!传联发科天玑8000/9000系列迭代芯片被砍
高通发布全新骁龙4 Gen 2 芯片:升级4nm工艺,CPU性能提升10%
近日,高通发布了新的入门级移动芯片组骁龙 4 Gen 2,从上一代的台积电6nm升级到了三星4nm工艺,为低端智能手机带来大幅升级。
芯智讯
2023/08/09
1.2K0
高通发布全新骁龙4 Gen 2 芯片:升级4nm工艺,CPU性能提升10%
你的4nm安卓旗舰芯片来了!骁龙8 Gen 1:支持8K HDR,功耗降30%,雷军:小米12首发
CPU方面继续采用“1+3+4”的设置,内置八核Kryo CPU包含1个Cortex-X2超大核、3个Cortex-A710大核和4个Cortex-A510小核。
量子位
2021/12/02
5060
你的4nm安卓旗舰芯片来了!骁龙8 Gen 1:支持8K HDR,功耗降30%,雷军:小米12首发
高通发布第二代骁龙7+处理器:Redmi Note 12 Turbo将首发
3月17日,高通公司正式发布了第二代骁龙7+ 移动平台,这也是高通迄今为止最强的骁龙7系芯片。
芯智讯
2023/03/24
8640
高通发布第二代骁龙7+处理器:Redmi Note 12 Turbo将首发
高通骁龙8 Gen2发布:CUP性能提升35%,GPU性能提升25%,AI性能提升4.35倍!
北京时间11月16日早间,高通在夏威夷举行了 2022 骁龙峰会,会上正式发布了其第二代骁龙8旗舰移动平台(骁龙8 Gen 2)。与第一代相比,骁龙8 Gen 2在CPU、GPU、AI、影像、音频、网络连接、游戏体验、可信安全等方面带来了全面的提升。
芯智讯
2022/11/22
1.2K0
高通骁龙8 Gen2发布:CUP性能提升35%,GPU性能提升25%,AI性能提升4.35倍!
基于定制的Oryon CPU内核,高通骁龙8cx Gen 4曝光
2月7日消息,据外媒Notebookcheck 报导,高通即将于2024年正式推出基于自研的定制CPU内核“Oryon”的骁龙处理器,届时将会被命名为骁龙8cx Gen 4,并将会采用台积电4nm制程工艺。
芯智讯
2023/02/09
4210
高通骁龙8 Gen 2现身Geekbench:小米13系列有望全球首发
日前高通公司正式宣布,将于11月16日-11月18日在三亚海棠湾举行2022骁龙技术峰会,届时万众期待的骁龙8 Gen 2旗舰平台将正式亮相。而结合此前相关爆料,不出意外的话,小米也将紧接着官宣全新的小米13系列将全球首发搭载该芯片,并且最早将在11月底就将推出该机型。现在有最新消息,近日该芯片的跑分已现身Geekbench跑分网站。
帝旭科技
2022/11/23
2920
高通骁龙8 Gen 2现身Geekbench:小米13系列有望全球首发
内有资料合辑 | 5G来了!如何看待高通发布的全新旗舰骁龙 855?
雷锋网消息,北京时间 12 月 5 日凌晨,高通一年一度的骁龙技术峰会在夏威夷举办,正式推出支持 5G 的全新 SoC 骁龙 855 移动平台。发布会上,高通花了大量时间阐述 5G 的到来将对行业带来深刻的改变,关于 855 的细节则要等到明天同一时间才会公布。
AI研习社
2018/12/24
4280
高通骁龙782G发布:CPU性能提升5%,GPU性能提升10%!荣耀10首发搭载
11月24日消息,继上周高通公司发布了全新的骁龙8 Gen2旗舰移动平台之后,近日,高通又推出了全新的骁龙7系列移动平台——骁龙782G,相比前代的骁龙778G+,骁龙782G 的CPU性能提高了5%,GPU性能提高了10%。
芯智讯
2022/12/09
1.3K0
高通骁龙782G发布:CPU性能提升5%,GPU性能提升10%!荣耀10首发搭载
天玑8000系列将于明日发布,性能超越骁龙888
活动火热报名中!欢迎扫码 天玑9000的产能问题,让联发科很头疼。 作者 | 来自镁客星球的家衡 今日,联发科在其官方微博宣布,将于明天正式发布天玑处理器系列新品。依据此前@数码闲聊站的爆料,这次联发科要发布的新品为天玑8000系列,包括天玑8100和天玑8000两款芯片。 从定位上来看,天玑8000系列为中端处理器,其中天玑8100性能更强,可以与市面上的次旗舰级别处理器媲美。从安兔兔的跑分可以看出,天玑8100综合成绩已经突破了82万分,超过了高通上一代骁龙888旗舰处理器,在天玑系列中仅次于天玑90
镁客网
2022/03/04
3890
高通推出骁龙778G 5G移动平台,荣耀50系列将搭载
昨日晚间,高通正式发布了新一代高端移动平台“骁龙778G”,号称在ISP影像、AI人工智能、GPU游戏方面拥有“三项全能”,可以带来极致的多媒体体验。
镁客网
2021/06/08
6140
高通4nm二代骁龙8发布,网友:网易赢了
就在刚刚发布的第二代骁龙8移动平台上,高通直接甩出一手基于硬件加速的实时光追技术。
量子位
2022/12/09
2990
高通4nm二代骁龙8发布,网友:网易赢了
高性能版骁龙8 Gen4测试成绩曝光,主频高达4.47GHz
9月25日消息,随着高通新一代旗舰移动芯片平台骁龙8 Gen 4的即将发布,近期三星也被曝光正在为新一代旗舰智能手机Galaxy S25 Ultra对骁龙8 Gen 4 进行了多次测试。而最新的爆料显示,拥有更高主频版本的骁龙8 Gen 4,其多线程得分获得了比上次更高的分数。
芯智讯
2024/09/27
2000
高性能版骁龙8 Gen4测试成绩曝光,主频高达4.47GHz
高通骁龙8 Gen 4 细节参数曝光:CPU及GPU性能均提升25%以上!
8月20日消息,随着高通新一代旗舰移动平台骁龙8 Gen 4的即将发布,该芯片的更多细节参数也开始被陆续曝光。
芯智讯
2024/08/21
2880
高通骁龙8 Gen 4 细节参数曝光:CPU及GPU性能均提升25%以上!
骁龙855/骁龙845实际功耗对比:大降20% ?
高通新一代旗舰移动平台骁龙855采用了7nm工艺制造,集成八颗Kryo CPU核心(一个Kryo 485超级内核+三个性能内核+三个效率内核)、Adreno 640 GPU图形核心、Hexagon 690 DSP数字信号处理器、Spectra 380 ISP图像信号处理器、骁龙X24 2Gbps高速基带等模块,专为AI增加了张量加速器并支持第四代AI引擎。
用户9732312
2022/05/13
1.4K0
骁龙855/骁龙845实际功耗对比:大降20% ?
推荐阅读
高通发布第三代骁龙7:GPU性能大涨50%,配备骁龙8系同款三ISP
8700
华为麒麟 970 发布,超越高通骁龙 835 了吗?
1.1K0
骁龙最强AI芯能力下放:小旗舰8s发布,端侧运行10B大模型,小米Civi首发
1770
支持百亿参数大模型、卢伟冰现场官宣小米首发,高通骁龙8s Gen3发布
1930
高通骁龙8+转投台积电!4nm制程整体功耗降15%,小米OPPO旗舰都安排上了
3520
首发二代骁龙7+平台,Redmi Note 12 Turbo定价1999元起!传联发科天玑8000/9000系列迭代芯片被砍
6660
高通发布全新骁龙4 Gen 2 芯片:升级4nm工艺,CPU性能提升10%
1.2K0
你的4nm安卓旗舰芯片来了!骁龙8 Gen 1:支持8K HDR,功耗降30%,雷军:小米12首发
5060
高通发布第二代骁龙7+处理器:Redmi Note 12 Turbo将首发
8640
高通骁龙8 Gen2发布:CUP性能提升35%,GPU性能提升25%,AI性能提升4.35倍!
1.2K0
基于定制的Oryon CPU内核,高通骁龙8cx Gen 4曝光
4210
高通骁龙8 Gen 2现身Geekbench:小米13系列有望全球首发
2920
内有资料合辑 | 5G来了!如何看待高通发布的全新旗舰骁龙 855?
4280
高通骁龙782G发布:CPU性能提升5%,GPU性能提升10%!荣耀10首发搭载
1.3K0
天玑8000系列将于明日发布,性能超越骁龙888
3890
高通推出骁龙778G 5G移动平台,荣耀50系列将搭载
6140
高通4nm二代骁龙8发布,网友:网易赢了
2990
高性能版骁龙8 Gen4测试成绩曝光,主频高达4.47GHz
2000
高通骁龙8 Gen 4 细节参数曝光:CPU及GPU性能均提升25%以上!
2880
骁龙855/骁龙845实际功耗对比:大降20% ?
1.4K0
相关推荐
高通发布第三代骁龙7:GPU性能大涨50%,配备骁龙8系同款三ISP
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档