【问题标题】:Is there a JavaScript way to do file_get_contents()?是否有 JavaScript 方法来执行 file_get_contents()?
【发布时间】:2012-05-28 10:35:50
【问题描述】:

这里是PHP documentation

如果我找不到纯粹的客户端方法来执行此操作,我将在 Ajax 调用中使用它。

$homepage = file_get_contents('http://www.example.com/');
echo $homepage;

有没有办法代替这个客户端,这样我就不必把字符串 ajax 了?

【问题讨论】:

  • 您要“包含”的文件的内容是什么?
  • 类似于上面的例子。它接受一个 URL 作为参数。这个 URL 是用户定义的。

标签: php javascript


【解决方案1】:

你可以这样做

JS代码:

$.post('phppage.php', { url: url }, function(data) {
    document.getElementById('somediv').innerHTML = data;        
});

PHP 代码:

$url = $_POST['url'];
echo file_get_contents($url);

这将为您提供 url 的内容。

【讨论】:

    【解决方案2】:

    JavaScript 无法从页面上抓取数据。它可以调用本地 PHP 脚本,然后代表它执行并获取数据,但 JavaScript(在浏览器中)不能这样做。

    $.post("/localScript.php", { srcToGet: 'http://example.com' }, function(data){
      /* From within here, data is whatever your local script sent back to us */
    });
    

    您可以使用 JSONP 和跨域资源共享等选项,但是这两个选项都需要设置另一端,因此您不能只选择一个域并开始发出数据请求。

    延伸阅读:Same origin policy

    【讨论】:

      【解决方案3】:

      此函数将文件作为字符串返回,就像 PHP file_get_contents() 一样。

      function file_get_contents(uri, callback) {
          fetch(uri).then(res => res.text()).then(text => callback(text));
      }
      

      然而与 PHP 不同的是,JavaScript 会继续执行下一条语句,而不是等待数据返回。

      【讨论】:

      • 根据您的链接的域/URL 与您的用户名相同或包含您的用户名,您似乎已链接到您自己的网站/您所属的网站。如果这样做,您必须披露它是您的网站。如果您不披露从属关系,则将其视为垃圾邮件。请参阅:What signifies "Good" self promotion?the help center on self-promotion。披露必须是明确的,但不需要是正式的。如果是您自己的个人内容,则可以是“在我的网站上……”、“在我的博客上……”等。
      【解决方案4】:

      现在是 2020 年,采用了一些现代方法;

      async function file_get_contents(uri, callback) {
          let res = await fetch(uri),
              ret = await res.text(); 
          return callback ? callback(ret) : ret; // a Promise() actually.
      }
      
      file_get_contents("https://httpbin.org/get", console.log);
      // or
      file_get_contents("https://httpbin.org/get").then(ret => console.log(ret));
      

      【讨论】:

      • 这是一个很好的解决方案,非常有用,感谢 es6 示例。
      • 如何将值放入要使用的变量中?
      【解决方案5】:

      不是一般意义上的。跨域限制不允许 Javascript 代码执行此操作。

      如果目标站点设置了CORS(跨域资源共享),则可以使用 XMLHttpRequest 加载文件。大多数网站不这样做,因为出于安全原因默认情况下它是关闭的,并且很少需要。

      如果您只需要包含一个 HTML 页面,您可以将其粘贴在 <iframe> 元素中。不过,这会受到一些布局问题的影响(页面最终会出现在固定大小的元素中)。

      【讨论】:

      • ...我可以对 iframe 进行任何分析...也许可以通过某种方式获取标题?
      • @CS_2013 不,如果iframe 不是来自您的域的文档,则不会。
      • 不。框架的内容几乎完全禁止。
      • 没有。出于非常好的安全原因,以这种方式设置跨域资源共享。阅读 Michal Zalewski 的优秀著作“The Tangled Web: A Guide to Securing Modern Web Applications”了解详细信息。
      • 嗯...它需要修改...因为我现在占用了更多的网络资源...添加另一个跃点...但仍然获得我想要获得的数据.. ..保持安全...消除低效率。
      【解决方案6】:

      或者您可以使用 php.js 库。这允许一些用于 javascript 的 php 函数。 file_get_contents() 函数其中之一。

      <script>
      var data = file_get_contents('Your URL');
      </script>
      

      你可以找到更多关于 php.js 的信息:http://phpjs.org/

      【讨论】:

      • 这也将受到同源政策的约束
      【解决方案7】:

      我认为这可能对你有用:

      一个带有“file-get-contents”方法的 npm 包,用于 node.js https://www.npmjs.com/package/file-get-contents

      它是异步的,所以如果你使用 express,它应该像这样使用

      app.get('/',  async (req, res)=>{
          //paste here the code below
      }
      

      例子

      const fileGetContents = require('file-get-contents');
       
      // A File request
       
      try {
          let data = await fileGetContents('/tmp/foo/bar');
       
          console.log(data);
      } catch (err) {
          console.log('Unable to load data from /tmp/foo/bar');
      }
       
      // Or a HTTP(S) request
       
      fileGetContents('https://pokeapi.co/api/v2/pokemon/1/').then(json => {
          const pokemon = JSON.parse(json);
       
          console.log(`Name of first pokemon is ${pokemon.name}`);
      }).catch(err => {
          console.err(`Unable to get content from PokeAPI. Reason: ${err.message}`);
      });
      

      【讨论】:

        【解决方案8】:
          <div id="svg">
        
          </div>
          <script>
        
            function file_get_contents(uri, callback) {
                 fetch(uri).then(res => res.text()).then(text => 
                {
        
                    var xmlSvg =text;
                    console.log(xmlSvg );
                    document.getElementById('svg').innerHTML = xmlSvg;
                })
            }
        
            
            var uri ='You-urlllllllll-svg';
        
            file_get_contents(uri);
        
        </script>
        

        【讨论】:

        • 您能否对此答案进行澄清?谢谢!
        猜你喜欢
        • 2023-03-21
        • 2019-05-25
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2016-02-23
        • 1970-01-01
        相关资源
        最近更新 更多