【问题标题】:POST from PHP to another (Java) web service and retrieving the (image) result从 PHP POST 到另一个(Java)Web 服务并检索(图像)结果
【发布时间】:2012-03-02 06:21:53
【问题描述】:

这些是步骤:

  • 来自浏览器的 POST 表单(文件/图像输入)发送到 PHP 服务器。
  • PHP 服务器然后使用 fsockopen 到 Java (GlassFish/Jersey) REST 服务,将图像作为内容发送,以便在那里完成更高级的成像工作,并将生成的图像返回给 PHP 服务器(或只返回一个图片的 URI)。
  • 然后 PHP 服务器将结果 (img src= ..) 在 HTML 文档中回显给用户。

在第一步中获取图像及其所有属性效果很好,但我需要帮助在从 PHP 到 Web 服务的 POST 请求中正确设置标头。

当前代码:

$fp = fsockopen("domain..", 80, $errno, $errstr, 30);
$contentlength = $_FILES["photo_file"]["size"];
$imageref = $_FILES["photo_file"]["tmp_name"];

$out = "POST /Uri to resource .. HTTP/1.1\r\n";
$out .= "Host: http://... \r\n";
$out .= "Connection: Keep-Alive\r\n";
$out .= "Content-type: multipart/mixed\r\n";
$out .= "Content-length: $contentlength\r\n\r\n";
$out .= "$imageref";

fwrite($fp, $out);
$theOutput;
while (!feof($fp))
{
  $theOutput .= fgets($fp, 128);
}
echo $theOutput;
fclose($fp);

向浏览器回显:“HTTP/1.1 400 Bad Request Content-Type: text/html Content-Length: 717”。

所以我需要格式更好的标头才能通过 REST Web 方法。如果我应该实现这一点,有人知道在球衣网络方法中使用什么参数来访问图像吗? 对于标准 HTML 表单,它是这样的:

@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response getFullImage(@FormDataParam("photo_file") InputStream imageIS {..ImageIO.read(imageIS)..}

希望对更好的架构提出建议,以便在 HTML 中实现这一点。

干杯

【问题讨论】:

    标签: java php post file-upload http-headers


    【解决方案1】:

    你可能对写得不好的请求有问题,应该首先使用cURL(在php中),manual page的基本示例用法(写入文件):

    $ch = curl_init("http://www.example.com/");
    $fp = fopen("example_homepage.txt", "w");
    
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
    

    另一个从curl_setopt() page设置帖子数据的例子:

    $data = array('name' => 'Foo', 'file' => '@/home/user/test.png');
    
    curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    

    并通过curl_getinfo()处理HTTP状态码:

    if(curl_getinfo($c, CURLINFO_HTTP_CODE) === 200){
        ...
    }
    

    您也可以手动设置 http 标头:

    curl_setopt($cURL,CURLOPT_HTTPHEADER,array (
            "Content-Type: text/xml; charset=utf-8",
            "Expect: 100-continue"
        ));
    

    【讨论】:

    • 谢谢。现在尝试 CURL,似乎我需要指定标头,我从 Java 服务器获得“不支持的媒体类型”。对于图像设置内容类型:多部分/混合?完成错误消息:“服务器拒绝此请求,因为请求实体的格式不受所请求方法的请求资源支持(不支持的媒体类型)”。我还需要知道如何在 REST 方法中设置参数。
    • @gorn 添加带有自定义标头的示例,您也可以通过设置CURLOPT_CUSTOMREQUEST(在curl_setopt)设置自定义请求类型。
    • 想通了。首先为 CURLOPT_POSTFIELDS 安排一个数据数组, $data = array( 'uploaded_file' => '@'.$imagedata.';filename='.$filename,);然后从 jax-rs 方法中的参数引用“上传的文件”,如下所示: (@FormDataParam("uploaded_file") InputStream imageIS) { } Sweet! =) 干杯!
    • 还有一个问题,我只需要来自 jax-rs 服务器响应的内容。我在 PHP 中收到作为字符串的响应,其中包含大量标头值,以及末尾的内容/有效负载。有什么办法可以让它只返回有效负载文本?完整响应:HTTP/1.1 100 Continue HTTP/1.1 200 OK X-Powered-By:Servlet/3.0 JSP/2.2(GlassFish Server Open Source Edition 3.1.1 Java/Oracle Corporation/1.7) 服务器:GlassFish Server Open Source Edition 3.1。 1 内容类型:文本/纯文本传输编码:分块日期:2012 年 2 月 9 日星期四 23:46:05 GMT URIIII
    • Server response。我只想要底部看到的内容(纯文本)。 PHP可以过滤掉标题吗?我想过使用字符串函数来获取最后一行,但这应该不是必需的。
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2019-01-24
    • 2016-07-30
    相关资源
    最近更新 更多