当前位置: 首页 > 知识库问答 >
问题:

用Guzzle重写curl(文件上载)-PHP

符学
2023-03-14

我正在尝试将文件上传到我的服务器,然后将该文件发送到Zendesk。Zendesk文档显示了如何:

curl "https://{subdomain}.zendesk.com/api/v2/uploads.json?filename=myfile.dat&token={optional_token}" \
  -v -u {email_address}:{password} \
  -H "Content-Type: application/binary" \
  --data-binary @file.dat -X POST

这很好用。我现在必须用Guzzle(版本6)重写这个。我正在使用Symfony 2.7:

$file = $request->files->get('file');

$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();

$body = [
        'auth' => [$this->params['user'], $this->params['pass']],
        'multipart' => [
        [
            'name'     => $archivo->getClientOriginalName(),
            'contents' => fopen($file->getRealPath(), "r"),
        ],
    ]
];

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $body);
$response = json_decode($response->getBody(), true);

文件正在上传,但当我下载它时,它的内容中也会包含一些元数据(破坏了其他一些文件类型)。我想我没有正确上传,因为卷发的另一种方式很好。

--5b8003c370f19
Content-Disposition: form-data; name="test.txt"; filename="php6wiix1"
Content-Length: 1040

... The rest of the original content of the test file...

--5b8003c370f19--

我不知道为什么这些数据也作为文件的一部分发送(我不想这样做),或者是否可以为此使用multipart。

感谢任何帮助!

共有1个答案

松英喆
2023-03-14

可以使用多部分,但服务器必须正确处理。无论您是否使用它,它都是一个不同的请求主体。

它通常用于HTML表单中(多个)文件上载。文件被命名(因此是元信息),因此可以有多个文件。文件中还可能有普通表单字段(文本)。你可能会通过搜索找到更好的解释,只是想给出一个简短的解释。

在您的情况下,服务器处理多部分表单数据的方式似乎与“二进制帖子”不同,因此它保存了所有数据,包括元信息。

使用body传递一个未加工的身体,并用口吻向你的卷发发出相同的请求:

$urlAttachments = $this->params['base_url']."/api/v2/uploads.json?filename=".$file->getClientOriginalName();

$opts = [
    // auth
    'body' => fopen($file->getRealPath(), "r"),
    'headers' => ['Content-Type' => 'application/binary'],
];

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $urlAttachments, $opts);
 类似资料:
  • 下面是通过FileBrowser将文件添加到目录的事件的问题。加载单个文件会产生一堆事件: 我认为消息的数量取决于上传zip文件的时间。我不知道如何用watchdog来解决它,下面是代码:

  • 问题内容: 我需要使用curl下载远程文件。 这是我的示例代码: 但是它不能处理大文件,因为它首先读取内存。 是否可以将文件直接流式传输到磁盘? 问题答案:

  • curl-i-x post-f“imageFile=./image.jpg”http://myserver.com:8080/admin/02d0828864100000000b28c545b728f4/icon/add-v POST/ADMIN/02D0828864100000000B28C545B728F4/ICON/ADD HTTP/1.1用户代理:curl/7.30.0主机:MyServe

  • 我想上传一个文件到不同的服务器使用卷曲。我读过许多类似的问题,但我没有得到任何解决我的问题。下面是我现在得到的代码: 当我运行此脚本时,它将保持运行200秒,并以以下方式响应: Sep 17 20:56:58 xxxxx vsftpd[2613]:[user]确定登录:客户端“yyyyy” Sep 17 20:56:58 xxxxx vsftpd[2618]:[用户]FTP响应:客户端“YYYYY

  • 我无法访问后端服务器,我通过网络分析了API。我想用那个API上传文件。我观察到,在对该API的post请求中没有参数。我观察到网络中的请求负载。 响应头 缓存控制:无缓存连接:保持活动内容长度:135内容类型:text/html;charset=utf-8日期:2016年8月6日星期六14:32:00 GMT地点:http://myURL服务器:nginx/1.2。3.设置Cookie:_mys

  • 问题内容: 我想知道如何使用cURL或PHP中的任何其他文件上传文件。我在Google中搜索了很多次,但没有结果。 换句话说,用户看到表单上的文件上传按钮,该表单被发布到我的php脚本中,然后我的php脚本需要将其重新发布到另一个脚本(例如,在另一个服务器上)。 我有此代码来接收文件并上传 代码: 我希望代码将文件发送到接收者文件。 问题答案: 采用: