- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 php 的 fsockopen 将文件上传到远程服务器。如果我的请求是这样的:
$httpContent = [
"POST /index.php HTTP/1.1",
"Host: The IP address of my remote server",
"Connection: Close",
"User-Agent: My client"
];
服务器响应 200 OK
。但是,如果我添加
"Content-Type: multipart/mixed; boundary=".md5('myBoundary'),
"--".md5('myBoundary'),
"Content-Type: text/plain",
"value",
"--".md5('myBoundary')."--"
服务器返回“400 Bad Request”。对我来说一切似乎都很好,但不知何故它不起作用。我做错了什么?
非常感谢任何帮助!
编辑(@Rei 建议发布请求转储):
这是客户端的回显
POST /index.php HTTP/1.1
Host: The IP address of my remote server
Connection: Close
User-Agent: My client
Content-Type: multipart/mixed; boundary=be0850c82dd4983ddc49a51a797dce49
--be0850c82dd4983ddc49a51a797dce49
Content-Type: text/plain
value
--be0850c82dd4983ddc49a51a797dce49--
这是服务器得到的(用 tcpdump 捕获):
POST /index.php HTTP/1.1
Host: The IP address of my remote server
Connection: Close
User-Agent: My client
Content-Type: multipart/mixed; boundary=be0850c82dd4983ddc49a51a797dce49
--be0850c82dd4983ddc49a51a797dce49
Content-Type: text/plain
value
--be0850c82dd4983ddc49a51a797dce49--
我个人认为两者之间没有任何区别,也没有发现请求有任何问题。然而,服务器返回“400 Bad Request”。
*注意:“我的远程服务器的 IP 地址”是一个真实的 IP 地址,但出于安全考虑,我没有发布它。
**注意:没有提到 PHP 脚本在 CLI 环境中运行并且不用作 Web 应用程序后端(请求不是由 Web 浏览器准备的)。
最佳答案
正如我所怀疑的,您发送的 HTTP 请求不符合 HTTP 规范。参见 RFC7230 Section 3 .问题:缺少 CRLF。
在最后一个 HTTP header 之后应该有一个额外的 CRLF,在最后一个 MIME header 之后也应该有一个。
POST /index.php HTTP/1.1
Host: The IP address of my remote server
Connection: Close
User-Agent: My client
Content-Type: multipart/mixed; boundary=be0850c82dd4983ddc49a51a797dce49
--be0850c82dd4983ddc49a51a797dce49
Content-Type: text/plain
value
--be0850c82dd4983ddc49a51a797dce49--
这将解决“错误请求”问题。
虽然问题的原因不是 Content-Type: multipart/mixed
header ,但您应该知道它已被弃用。请改用 Content-Type: multipart/form-data
。参见 related answer here和 RFC7578 .
内容类型multipart/form-data
可用于发送值和文件。区别仅在于属性 filename
。
尽可能少地修改您的 HTTP 请求,这里是发送两个字段(一个文件和一个值)的示例:
POST /index.php HTTP/1.1
Host: The IP address of my remote server
Connection: Close
User-Agent: My client
Content-Type: multipart/form-data; boundary=be0850c82dd4983ddc49a51a797dce49
Content-Length: 234
--be0850c82dd4983ddc49a51a797dce49
Content-Disposition: form-data; name="one"; filename="example.txt"
foo
--be0850c82dd4983ddc49a51a797dce49
Content-Disposition: form-data; name="two"
bar
--be0850c82dd4983ddc49a51a797dce49--
对于每个字段,您需要一个 Content-Disposition
header ,以便能够命名该字段并可选择为其指定一个文件名。
Content-Type
是可选的,但如果值出现乱码,您可能需要添加一个。
如果您只需要上传一个文件,请根据需要进行修改。
这是我用来测试 HTTP 请求的一个简洁的小脚本:
<?php
header('Content-Type: application/json');
echo json_encode([
'method' => $_SERVER['REQUEST_METHOD'],
'uri' => $_SERVER['REQUEST_URI'],
'body' => file_get_contents('php://input'),
'GET' => $_GET,
'POST' => $_POST,
'FILES' => $_FILES,
'headers' => getallheaders(),
], JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
在接收端使用该脚本,我将我的示例请求未修改发送到我的本地主机服务器,我得到了这个结果:
HTTP/1.1 200 OK
Date: Tue, 31 Jul 2018 11:33:57 GMT
Server: Apache/2.4.9 (Win32)
Connection: close
Transfer-Encoding: chunked
Content-Type: application/json
254
{
"method": "POST",
"uri": "/index.php",
"body": "",
"GET": [],
"POST": {
"two": "bar"
},
"FILES": {
"one": {
"name": "example.txt",
"type": "",
"tmp_name": "C:\\wamp\\tmp\\phpD6B5.tmp",
"error": 0,
"size": 3
}
},
"headers": {
"Host": "The IP address of my remote server",
"Connection": "Close",
"User-Agent": "My client",
"Content-Type": "multipart/form-data; boundary=be0850c82dd4983ddc49a51a797dce49",
"Content-Length": "234"
}
}
0
如您所见,字段“一”转到 $_FILES
,字段“二”转到 $_POST
。
首先,发送不加修改的示例请求。继续尝试,直到得到正确的结果。然后根据需要进行修改,确保请求仍然遵循 HTTP 规范的每一步。
关于php - HTTP header "Content-type: multipart/mixed"导致 "400 Bad request",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51575746/
任何调用 npm run升级到 Mix v4.x 后导致 mix 未定义。我在每次运行时都会看到这样的错误: > npm run development > @ development /projec
升级到 Laravel-Mix 6 之前: Laravel-Mix 版本:5.0.9(支持 Webpack 4) NPM 版本:6.14.5 通过这个 laravel 混合版本,我能够通过运行 pac
在 Laravel 5.5 中,我使用 laravel-mix 来编译我的 Assets 。 但是我不清楚:mix.js 之间有什么区别?和 mix.scripts为什么我要使用一个而不是另一个? 最
我有以下 webpack.mix.js: const { mix } = require('laravel-mix'); mix.scripts([ 'resources/assets/js/
目前,我正在寻找在运行 mix 任务时添加 SQL 语句日志记录的方法。例如,mix ecto.rollback 和 mix ecto.migrate 等命令输出信息: ... 13:45:53.01
我知道这个问题已经被问过了,答案总是单独的答案。 但是我看到 Mix.EctoSQL.ensure_started 提到了很多,这似乎是公认的方法。 然而,在 ecto_sql 3.1.2 中,此功能
mix compile ==> gettext could not compile dependency :gettext, "mix compile" failed. You can recompi
我正在使用 Laravel 5.5 ,在 webpack.mix 文件中,mix.styles 函数完美运行,我完美地编译了我的 css 文件,但是mix.scripts 不编译我在文档中找到的 js
如果我有一个mix.exs文件,例如: defmodule Mix.Tasks.My_task do use Mix.Task @shortdoc "Perform my task" de
这是我第一次使用 Laravel Mix、NodeJS 和 NPM。我试图遵循 Laravel 的文档并相信我做得对,但谁知道呢。 我正在尝试将多个 CSS 文件合并为一个。 webpack.mix.
我对系统发育回归模型比较陌生。过去,当我的树中每个物种只有 1 个条目时,我使用了 PGLS。现在我有一个包含总共 9 个物种的数千条记录的数据集,我想运行一个系统发育模型。我阅读了最常见软件包(例如
TLDR; 您是否必须链接 Laravel Mix 方法来维护执行顺序?是否有任何异步方法会阻止使用以下非链接模式,mix.scripts(); mix.js(); mix.sass(); ? 我运行
我想为支持“显示:网格”但不支持 IE/MS Edge 的浏览器提供特定部分的 CSS。你如何混合正面和负面的@support 查询? 你能写“and not”还是有类似的符号?不幸的是,以下方法不起
在生产中,加载我使用的 Assets ,例如: 并期望在编译时看到: 但是我只是看到相对路径: webpack.mix.js: mix .js('resources/assets/js/ap
有人可以向我解释一下 MIX 中的除法(来自 Knuth 的 TAOCP)是如何在字节到字节的基础上工作的吗? rA = |-| . . . .0| rX = |+|1235|0|3|1| 内存位置
我正在尝试使用我从 themeforest 与 Laravel 购买的主题 我已经使用 mix.copy 将我的字体从 node_modules 移动到我的 public 目录,这工作正常。/ 但是,
至少就在两周前,我一直在代理后面使用mix。但是我昨天发现 mix 无法在代理后面工作。混合版本是1.1.1。mix local.hex 运行。但是mix deps.get 出现错误。 $ mix d
我有一个 C++ 程序,我在其中使用递归迭代器遍历我作为参数提供给程序的文件夹。 问题是,当我在路径上调用 .string 时,我在路径中混合了\和/。使用 .generic_string 修复了这个
所以我有一个 JS 文件,我想使用 Laravel mix 进行混合、复制和压缩;我的 webpack.mix.js 文件如下所示: const mix = require('laravel-mix'
我有一个 Elixir 伞形项目。这个项目中的每个应用程序都可以使用 mix escript.build 编译成可执行文件。 我正在尝试从伞项目的根目录运行此命令并收到以下错误 ** (Runtime
我是一名优秀的程序员,十分优秀!