Php 相当于 Java 的 newInputStreamSupplier 是什么?
What is Php's equivalent of Java's newInputStreamSupplier?
我一直在尝试实现 Java 中编写的功能,用于通过 PUT HTTP 请求上传文件。
这是我的示例 Java 代码:
import com.google.common.io.Files;
public void uploadFile() {
final makeRestRequest makeUploadRequest = makeRequestTo(upload_file_location)
.method("PUT")
.addHeader(new HttpHeader("Accept", "application/json"))
.addHeader(new HttpHeader("Content-Type", "application/zip"))
.body(Files.newInputStreamSupplier(new java.io.File("/sample_file.zip")))
.build();
final getRestResponse uploadResponse = makeUploadRequest.fetchResponse();
}
我正在寻找 php 代码的类似变体,它可以进行 HTTP PUT 调用以上传文件,但我不确定 newInputStreamSupplier[ 使用什么=23=]。这是我的示例 php 代码,它使用 CURL 调用 PUT 上传文件,但没有得到响应:
<?php
$url = upload_file_location;
$localfile = "sample_file.zip";
$fp = fopen ($localfile, "rb");
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$headers = array();
$headers[] = 'Content-Type: application/zip';
$headers[] = 'Accept: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
$http_result = curl_exec($ch);
?>
我收到一条错误消息:"File content is empty"。有人知道我做错了什么吗?
好吧,我找到了解决问题的方法。
我应该将完整路径传递给 CURL 文件大小 header:
中的文件
curl_setopt($ch, CURLOPT_INFILESIZE, filesize(realpath($localfile));
此外,我必须添加以下 CURL header 以将文件数据传输为二进制文件:
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
this question中提到的解决方案对我有帮助。
我一直在尝试实现 Java 中编写的功能,用于通过 PUT HTTP 请求上传文件。
这是我的示例 Java 代码:
import com.google.common.io.Files;
public void uploadFile() {
final makeRestRequest makeUploadRequest = makeRequestTo(upload_file_location)
.method("PUT")
.addHeader(new HttpHeader("Accept", "application/json"))
.addHeader(new HttpHeader("Content-Type", "application/zip"))
.body(Files.newInputStreamSupplier(new java.io.File("/sample_file.zip")))
.build();
final getRestResponse uploadResponse = makeUploadRequest.fetchResponse();
}
我正在寻找 php 代码的类似变体,它可以进行 HTTP PUT 调用以上传文件,但我不确定 newInputStreamSupplier[ 使用什么=23=]。这是我的示例 php 代码,它使用 CURL 调用 PUT 上传文件,但没有得到响应:
<?php
$url = upload_file_location;
$localfile = "sample_file.zip";
$fp = fopen ($localfile, "rb");
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$headers = array();
$headers[] = 'Content-Type: application/zip';
$headers[] = 'Accept: application/json';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile));
$http_result = curl_exec($ch);
?>
我收到一条错误消息:"File content is empty"。有人知道我做错了什么吗?
好吧,我找到了解决问题的方法。 我应该将完整路径传递给 CURL 文件大小 header:
中的文件curl_setopt($ch, CURLOPT_INFILESIZE, filesize(realpath($localfile));
此外,我必须添加以下 CURL header 以将文件数据传输为二进制文件:
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
this question中提到的解决方案对我有帮助。