转载自:https://blog.csdn.net/freedomwjx/article/details/43278157
(注:在curl前面加上time如time curl xxx,可以在最后显示访问时间,主要看real的那一栏)
一. 首先,最简单的情况是我们只需要提交一个不带文件上传的表单,这种情况下,只需要在curl中使用--data(注意是--不是-)或者它的缩写-d即可。
  1. curl -d "key=value&key=value" "url"
    或者
  1. curl --data "key=value&key=value" "url"
    (注意:如果键值对只有一个的话,可以不写双引号,但是如果有多个键值对,必须加上双引号,键值对之间用&连接)
 
    现在假设我们有一个登陆表单,它看起来可能是这样的
  1. <form  action="doLogin" method="post">
  2. <input type="text"  name="username"  value="admin"/>
  3. <input type="password"  name="password"  value="admin"/>
  4. <button type="submit"  value="submit" />
  5. </form>
    那我们的curl就应该写成这样
  1. curl -d "username=admin&password=admin" "www.xxxx.com/doLogin"
    如果登陆后网页被重定向,而我们想追踪这个重定向的话可以加上-L参数(L必须大写),表示追踪重定向
  1. curl -L  -d "username=admin&password=admin" "www.xxx.com/doLogin"
二. 稍微复杂的情况:现在我们希望进行一些必须在登陆前提下的post请求,那就需要先保存我们之前的成功登陆的cookie信息,然后再携带登陆信息进行post请求
    1.保存登陆cookie信息到文件可以通过以下2个选项中的任意一个实现
    -c :保存cookie信息
    -D:保存整个header信息,包括cookie
    示例:
  1. curl -c cookie.txt  -d "username=admin&password=admin" "www.xxx.com/doLogin"
    运行后会在你执行指令的目录下生成一个cookie.txt文件,当然你也可以指定该文件的创建路径,相对路径绝对路径皆可(如cookie.txt可以改成 /path/cookie.txt)
 
    2.携带登陆信息进行post请求需要使用-b选项
        -b:指定使用哪个文件
        示例:
  1. curl -L -b cookie.txt -d "key=value" "url"
三. 模拟表单文件上传,相当于form表单中method="POST"和enctype="multipart/form-data"的情况
        
        这个时候就需要用到-F选项了
        curl -F "key=@value" "url"
 
        假目前我们的文件上传表单是这样的:
  1. <form  action="upload" method="post" enctype="multipart/form-data">
  2. <input type="file"  name="myfile" />
  3. <button type="submit"  value="submit" />
  4. </form>
        我们想提交一个名为hellocurl.zip的文件,该文件在我们指令所在的根目录下。
 
        那我们的curl就是这样的
  1. curl -F "myfile=@hellocurl.zip" "www.xxx.com/upload"
        如果上传的文件不止一个,可以写多个-F "key=@value"
  1. curl -F "myfile1=@hellocurl1.zip" -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload"
        再来看一个更加贴近实际的情况:很多时候,我们的表单还会包含许多其他表单元素,如text,checkbox,select等等。
        
        现在我们在上面表单的基础上加入更多元素,变成下面这样:
  1. <form  action="upload" method="post" enctype="multipart/form-data">
  2. <span style="color:#990000;"><input type="text"  name="filename"  value="hellocurl"/></span>
  3. <input type="file"  name="myfile" />
  4. <button type="submit"  value="submit" />
  5. </form>
        同时我们想提交hellocurl.zip文件
 
        这时候我们可能会想到加上-d
 
        特别注意,这个时候我们不能同时使用-d和-F,这2个选项在curl中是两种方式的请求,-d为application/x-www-url-encoded方式发送post请求,而-F为multipart/form-data方式,
        如果在一次curl中同时使用-d和-F选项会报Warning: You can only select one HTTP request!的警告,导致指令无法执行
 
        这种情况下,现在网上很多给出的解决方案是通过增加-F的方式来解决
 
        即:
  1. curl -F "filename=hellocurl" -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload"
        但是我在一个spring mvc的项目中测试这个方法的时候发现,由于拿不到filename的值,无法绕过服务器端的验证,导致提交失败
        如果你也碰到类似的情况,可以尝试下以下解决方法:
  1. curl -F "key=@value" "www.xxx.com/upload?key1=value1&key2=value2"
        具体到当前的问题我们的curl就是:
  1. curl -F "myfile2=@hellocurl2.zip" "www.xxx.com/upload?filename=hellocurl"
        该方法亲测通过,并且仍然是post的提交方式。
 
        其他一些实用选项:
        -v:查看请求的整个完整的过程
        -i:查看请求头信息

-o:保存响应结果到指定路径的文件中,如: curl -o tmp.txt http://www.csdn.net   #保存响应到tmp.txt

CURL模拟表单post提交及相关常用参数的使用(包括提交表单同时上传文件)的更多相关文章

  1. 关于php上传文件过大的表单回填

    也许标题有点绕口,有点无法让人理解.请原谅博主,语文学的不好,都赖体育老师. 问题场景重现:在某次迭代中,接到这样一个需求:当新建或编辑一个Bug(包含附件以及其他字段)上传附件过大时,退回到编辑页面 ...

  2. c# 模拟表单提交,post form 上传文件、大数据内容

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  3. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...

  4. java 模拟表单方式提交上传文件

    /** * 模拟form表单的形式 ,上传文件 以输出流的形式把文件写入到url中,然后用输入流来获取url的响应 * * @param url 请求地址 form表单url地址 * @param f ...

  5. c# 模拟表单提交,post form 上传文件、数据内容

    转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...

  6. 使用CURL模拟表单上传文件

    //以下代码适合PHP7.x PHP5.6$file = new CURLFile('./127.zip','application/octet-stream');$file->setMimeT ...

  7. Linux 基础命令-CURL 表单上传文件

    CURL -F, --form <name=content> (HTTP) This lets curl emulate a filled-in form in which a user ...

  8. 4 django系列之HTML通过form标签来同时提交表单内容与上传文件

    preface 我们知道提交表单有2种方式,一种直接通过submit页面刷新方法来提交,另一种通过ajax异步局部刷新的方法提交,上回我们说了通过ajax来提交文件到后台,现在说说通过submit来提 ...

  9. tp中附件上传文件,表单提交

    public function tianjia(){ $goods=D('Goods'); if(!empty($_POST)){ if($_FILES['f_goods_image']['error ...

随机推荐

  1. swift 8.0之后打开 手机设置

    if #available(iOS 8.0, *){ if let url = URL(string: UIApplication.openSettingsURLString), UIApplicat ...

  2. 测试SD卡读写速度

    执行测试命令之前,一定先清除缓存:# echo 3> /proc/sys/vm/drop_caches SD卡读取的速度# echo 3> /proc/sys/vm/drop_caches ...

  3. Head First Servlets & JSP 学习笔记 第四章 —— 作为Servlet

    Servlet的任务是得到一个客户的请求,再发回一个响应. 请求: 容器控制着Servlet的一生,它会创建请求和响应对象.为Servlet创建一个新线程或分配一个线程,另外调用Servlet的ser ...

  4. how2j网站前端项目——天猫前端(第一次)学习笔记5

    收拾好心情,现在开始学习第5个页面——购物车页面! 一.结算按钮 这个还是比较简单的,我自己看着站长的样子模仿了一个: 有个地方不会做,就是全选前面的复选框,站长的框里面是白色的,我搞不来. 二.订单 ...

  5. Java运算符号,对象赋值,别名

    生活发生的一切,才会促使着我继续前行,今天继续更新哦,看书中的代码练习. 例子1  引入net.mindview.util.Print.* ,方便打印结果. package com.date0529; ...

  6. PAT 1067 试密码(20)(代码)

    1067 试密码(20 分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码(长度 ...

  7. [Robot Framework] 通过Robot Remote Server调用White Library测试WPF开发的桌面产品

    参考 : https://github.com/jatalahd/WhiteRobotLibrary 通过此源代码编译WhiteRobotLibrary.dll,然后把高亮标记的这5个dll全部拷贝到 ...

  8. Python之路(第六篇)Python全局变量与局部变量、函数多层嵌套、函数递归

    一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序. 全局变量没有任何缩进,在任何位置都可 ...

  9. PDO beginTransaction (),exec(),commit ()

    $dsn = 'sqlsrv:server=.\SQLExpress;Database=thinkphp'; $user = 'admin'; $password = 'pass1234'; try ...

  10. OneZero第三周第一次站立会议(2016.4.4)

    1. 时间: 13:30--13:45  共计15分钟. 2. 成员: X 夏一鸣 * 组长 (博客:http://www.cnblogs.com/xiaym896/), G 郭又铭 (博客:http ...