Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将blob(AJAX响应)保存到命名文件(JSON类型)中,并保存到我的服务器中,而不是用户计算机中_Javascript_Jquery_Ajax_Api_File Handling - Fatal编程技术网

Javascript 如何将blob(AJAX响应)保存到命名文件(JSON类型)中,并保存到我的服务器中,而不是用户计算机中

Javascript 如何将blob(AJAX响应)保存到命名文件(JSON类型)中,并保存到我的服务器中,而不是用户计算机中,javascript,jquery,ajax,api,file-handling,Javascript,Jquery,Ajax,Api,File Handling,我已经阅读了几乎所有关于从计算机中的blob创建(或下载)URL的主题,但是我需要一些不同的东西: (1) 要将自己服务器中的blob保存到JSON文件中,请 (2) 优化使用JSON中存储的数据更新数据库的方法 我尝试了下面所有的代码变体,但没有成功 var blob = new Blob(response, { type: contentType }); var file = new File([blob], filename, {type: contentType, lastModifie

我已经阅读了几乎所有关于从计算机中的blob创建(或下载)URL的主题,但是我需要一些不同的东西:

(1) 要将自己服务器中的blob保存到JSON文件中,请

(2) 优化使用JSON中存储的数据更新数据库的方法

我尝试了下面所有的代码变体,但没有成功

var blob = new Blob(response, { type: contentType });
var file = new File([blob], filename, {type: contentType, lastModified: Date.now()});
其中,响应是来自下面代码的解析结果

如果服务器中已经有一个内容为空的文件,那么打开它并从blob更新它(然后关闭它)会更好吗

我的目的是将响应内容从AJAX查询(从API)下载到我的服务器(而不是浏览器中的任何客户端计算机),然后更新数据库表中的相应值

用例如下:我使用cron从一个API收到一个价目表(大约40000项),然后我必须更新服务器数据库中的产品价格

让我们看看下面的代码:

<div id="app">
    <p style="text-align: center; margin-top: 50px;">
        <i class="fa fa-spinner fa-spin" style="font-size: 15px;"></i><br>
        please wait to load the list of items here...
    </p>
</div>

<script>
var settings = {
  "url": "https://www.notimportant/etc/",
  "method": "GET",
  "timeout": 0,
  "headers": {
    "GUID": "something"
  },
};


$.ajax(settings).done(function(response) {
  var parsedJSON = JSON.parse(response);
  
                                                  console.log(parsedJSON[0]); /* <= to see the structure of each object in the response array */
                                                  console.log('total items: ' + parsedJSON.length);
  
   var template = `
<p>List of items</p>
{{#each this}}
<div>{{plusOne @index}} - Code: {{ProductCode}} - Name: {{ProductName}} - Price: {{ProductPrice}}</div>
{{/each}}
`;

Handlebars.registerHelper('plusOne', function(index) {
    index++;
    return index;
});
  var show = Handlebars.compile(template);
  $('#app').html(show(parsedJSON));
});
        </script>


@Bravemaster的建议很有帮助,代码现在运行不到10秒,所以目前这是一个可接受的解决方案。第(2)点已经很好地解决了,(1)点似乎不再有用了(因为同时使用file\u put\u内容和file\u get\u内容是没有意义的)。我还投票支持Bravemaster的输入作为公认的答案——感谢他对我的代码的慷慨贡献。所有40k+查询都在一个批次中顺利完成。剩下的就是添加更多的数据验证(为了安全起见)和设置cron进程(不是真正的问题)。

您不需要从客户端的外部API获取数据,也不需要将数据再次发布到服务器上

PHP可以在不使用jQuery的情况下发送get请求和接收响应

您可以编写php脚本从外部API获取产品价目表,如下所示:

$url=”https://www.notimportant/etc/";
$header=['GUID'=>'something']
echo“正在向API服务器发送请求…\n”;
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_HEADER,$HEADER);
$response=curl\u exec($ch);
echo“接收到响应\n”;
卷曲关闭($ch);
$data=json_decode($response);
回声“产品计数:”。计数($数据)。“\n”;
echo“将产品保存到数据库…”;
foreach($productInfo形式的数据){
save_data($productInfo);//您需要实现save_data
}
echo“产品已保存。正在退出”\n;
出口(0);
如果您想知道如何将字符串(本例中为JSON响应)写入文件,请参考以下内容:

如果您想知道如何使用准备好的语句执行MySQL查询,请参阅以下内容:

如果您想知道如何发送带有自定义标题的https请求,请参阅以下文章:

如果您想知道如何使用crontab定期执行php脚本,请参阅本文:

(,它们都是stackoverflow Post)

我会使用一些优雅的东西,比如说在一个事务中使用500个查询(并在80个步骤中完成整个更新,而不是一个完整的40000个简单查询),但不确定如何正确设置一切


事务不会提高性能,事务不是为了性能,而是为了数据完整性。制作40000个简单查询并一次执行(或者一个接一个,如果你这么说的话)是这里最好的选择。

我正在查看从PhpAdmin下的MySql数据库导出的一个.sql文件。前50行是设置编码、时区和创建两个表。其中一个表的所有122个条目都用一条语句插入。我很确定过去我一次做了几千件。下面链接中突出显示的黄色文本似乎是明确的@enhzflep我不确定INSERT在您提到的上下文中是否与UPDATE相同,因为我还必须检查每个查询的WHERE子句。@Eve注释不会给我们任何声誉。对我来说也是如此。我想问题是你一次问的问题太多了。把它分成几个小问题,然后把它们放到几个问题中(或者发现它们是这样的),这样人们就不会那么不高兴了。@Eve,我想你误解我了。把一个大问题分解成更小的小问题并不是为了回答这些问题。这是为了你。在这个过程中,你将重述你的问题,并可能知道你错在哪里或你遗漏了什么。此外,其他开发人员更容易理解您的问题,希望他们中的许多人能帮助您。你接受了我的回答,但我怀疑我的回答是否真的适合你的问题。因为你的帖子太长,问了很多问题,我不知道你问了什么。也不是其他人。如果你正面临着一连串的反对票(通过固定数量的跟踪者),请联系SE版主。但我认为,在这样的情况下,没有什么能比得上连续投下的反对票。
for(i = 0; i < parsedJSON.length; i++) { // use here $.post to send ProductCode, ProductName and ProductPrice to a php file where I execute a query to update each product into the database

var ProductCode = parsedJSON[i].ProductCode;
var ProductName = parsedJSON[i].ProductName;
var ProductPrice = parsedJSON[i].ProductPrice;

  $.post("update_db.php", {code: ProductCode, name: ProductName, price: ProductPrice}, function(data, status){
    console.log("Product " + ProductCode + " update = " + status);
  });
}

alert("all products' update was finished");
<?php
$servername = "localhost";
$username = "someuser";
$password = "somepassw";
$dbname = "somedb";

// requiring data from API

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://www.notimportant/etc/",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS =>"{\"name\": null, \"stores\": null, \"products\": []}",
  CURLOPT_HTTPHEADER => array(
    "GUID: something",
    "Content-Type: application/json"
  ),
));

$response = curl_exec($curl);

curl_close($curl);

                                                        // echo $response;
$data = json_decode($response);
echo "Product count: " . count($data) . "<br>\n";
echo "Preparing to save products to database... <br>\n";

// end receiving data from API



// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

// prepare and bind
$stmt = $conn->prepare("UPDATE `my_table` SET `price` = ?, `stock` = ? WHERE `my_table`.`product_id` = ?"); 
$stmt->bind_param("dii", $price, $stock, $id);

// set parameters and execute
foreach($data as $productInfo) {
    $price = $productInfo->RetailPrice;
    $stock = $productInfo->Stock;
    $id = $productInfo->ProductId;
    $stmt->execute();
    }

echo "Update was ok";

$stmt->close();
$conn->close();

?>