通过POST避免URL长度限制

时间:2012-11-18 18:45:53

标签: ajax forms url pdf post

我目前正在开发基于Adobes Scene7的web2print项目。打印产品的完整网址(pdf)非常长,超出了网址长度的所有浏览器限制。因此,为了获得最终的打印产品,我假设我必须通过POST方法以不同的方式提交URL。 似乎有两种方式:首先,使用html表单(method = post)并将所有url参数创建为(隐藏)输入字段。其次,使用post。进行ajax调用(例如jQuery.ajax)。

实际上如果我在浏览器中打开打印网址,就会在浏览器中打开就绪​​pdf。所以我需要一种方法通过POST将非常长的URL发送到服务器并打开我从中获取的PDF。测试ajax版本我遇到了同源策略并收到错误,因为我调用的是不在本地服务器上的URL。这必须是web2print项目中的标准情况,这是如何处理的?

提前谢谢 Michbeck

1 个答案:

答案 0 :(得分:0)

我解决了问题。我分两步完成。首先,我使用ajax将基本url和url参数发送到本地服务器上的php脚本。使用jQuery很容易做到:

jQuery.ajax({
    type : "POST",
    url : './includes/php/userdata.php',
    data: { method: 'get_print_version',
            url: base_url,                  
            parameter: query_parameter,
            num: num_parameter },
    error: function(error) {
        console.log("Print version failed");
  },
  success: function(reault) {
    console.log("What is the result?");
  }         
});             

服务器脚本使用cURL将数据发送到最终服务器。因此,基本URL和参数不会作为一个URL发布,而是通过使用CURLOPT_POST和CURLOPT_POSTFIELDS分隔。可以使用file_put_contents将服务器响应(pdf)写入文件。如果PDF变大,您将在此处获得内存限制错误。比将cURL的答案直接写入pdf文件更好。

if ($_method == 'get_print_version')
{
    $url = $_REQUEST['url'];
    $parameter = $_REQUEST['parameter'];
    $num = $_REQUEST['num'];

    $post = curl_init();

    curl_setopt($post, CURLOPT_URL, $url);
    curl_setopt($post, CURLOPT_POST, $num);
    curl_setopt($post, CURLOPT_POSTFIELDS, $parameter);

    /* write calendar directly to file */
    $pdf = fopen('./Calendar.pdf', 'w');
    curl_setopt($post, CURLOPT_FILE, $pdf);

    curl_exec($post);
    curl_close($post);          

    echo $result;           
}