主頁 > .NET開發 > 使用AjaxGET下載壓縮的JSON檔案

使用AjaxGET下載壓縮的JSON檔案

2022-07-04 10:52:49 .NET開發

賞金在 5 天后到期此問題的答案有資格獲得 100聲望賞金。 10GeV提請更多關注這個問題:
一個明確的解決方案將是理想的,但我也愿意接受有關如何進一步除錯和/或診斷問題的建議。如果我可以提供任何可能有用的附加資訊,請告訴我。

背景。

我的任務是除錯一些PHP和代碼,這些JavaScript代碼旨在gzip從主機服務器中提取靜態的 'ed JSON 檔案,并操縱生成的 JSON 物件的引數。

為我濫用術語提前道歉。我有一些軟體開發經驗,但很少有網路/服務器開發經驗(幾乎沒有PHP/ JavaScript)。


代碼。

要從主機服務器“拉”.json.gz檔案,使用 jQuery 的 Ajax 函式:

function myJsonReader() {
    var myJsonFileUrl = getUrl();
    
    function doFunStuffWithJsonFile(jsonObject) {
        // Fun things happen
    }

    $.ajax({
        url: myJsonFileUrl,
        type: "GET",
        dataType: "json", 
        success: doFunStuffWithJsonFile,
        error: function(jqxhr, status, exception) {
            console.log("Exception "   exception);
             alert('Failure:', exception);
             
        }
    }); 

}

服務器端,我們有一個index.php檔案,前幾行是:

<?php
  header('Accept-Encoding: gzip');
  header('Content-Encoding: gzip');
?>

<html>
<head>
... some HTML code

AjaxGET請求失敗。我知道該檔案存在,并且我正在傳遞絕對路徑。此外,如果我使用dataType: "text",我可以讀取壓縮檔案,但這當然會回傳“垃圾”:

????%^??0??jN?L/??8??@??x???351?g?? ??~???????/??7???^??di9?y;jY??6?$K?=??4??QTMB?^or??M?P????*}??G?t??K!#?8?Z@[d?9?#????R??N?????y??????????;9?T????B ??VM?#??.:?<??F?PZ???l[K?N[? G?ě?.5;P6?H??je???<?e""?h?-!?>??S?E??Q?m?H?.?SAyc?S?MsFHF?K]?H)/ry`?6.??&??-ME???s?????GA??@?rJ?.????)??kR?Vi?6??h?K-`????????

如果我使用以下命令檢查 XHR 回應:

error: function(xhr, status, error) {
        console.log(xhr.responseText);
        }

我也得到垃圾

該檔案是一個有效的 JSON 檔案,Vim 可以通過其內置gunzip功能讀取。此外,此代碼以前能夠使用 Ajax 呼叫且不使用外部庫而毫無問題地讀取這些 gzip 壓縮的 JSON 檔案,直到假定已經進行了一些未知的更改(由于混亂且大部分未記錄,這是不可能的追蹤該變化)。

不幸的是,無法簡單地解壓縮我們希望使用此功能讀取的所有檔案,也無法使用外部庫(例如zlib)。


一些訊息來源表明這應該是相對簡單的(例如這個 StackOverflow 帖子這個)。可悲的是,我不清楚我錯過了什么。


編輯。

重新加載頁面后,我檢查了NetworkChrome 的檢查器中的選項卡。我看到了Fetch/XHR對我的 JSON 檔案的請求。其標題包括以下內容:

Requested Method: GET
Content-Type: application/x-gzip
Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate
Status Code: 200 OK

在我未經訓練的眼睛看來,它似乎已正確配置為接受壓縮檔案。

uj5u.com熱心網友回復:

如果您的服務器為 AJAX 呼叫回傳此標頭:

Content-Type: application/x-gzip

沒有這個:

Content-Encoding: gzip

那么瀏覽器將不會解壓縮回應。為了讓它透明地解壓縮它,你需要這樣的東西:

Content-Type: application/json
Content-Encoding: gzip

向您的 HTML 頁面添加Accept-EncodingContent-Encoding標題(就像您所做的那樣)當然沒有效果。你應該洗掉它們。

Apache 發送的標頭取決于它的配置方式。您的服務器配置最近可能已更改。

您有 2 個解決方案:

  • 修改您的 Apache 配置,以便它發送.json.gz檔案的預期標頭
  • 使用 PHP 腳本檢索壓縮的 JSON 檔案

以下是此類腳本 ( getJSON.php) 的示例:

<?php
$name = $_GET['name'];

header('Content-Type: application/json');
header('Content-Encoding: gzip');
readfile("path/to/$name.json.gz");
?>

要檢索的 URLtest.json.gz將是:

url: 'getJSON.php?name=test'

備注:如評論中所述,推薦的做法是檢查 的值$name(例如只允許字母和數字)以禁止使用../字符,這將允許攻擊者訪問.json.gz預期目錄之外的檔案。

更新

您在評論中.htaccess說包含 JSON 檔案的目錄中存在以下檔案:

<filesMatch ".(gz)$">
    <ifModule mod_headers.c>
        Header set Content-Encoding "gzip"
    </ifModule>
</filesMatch>

該指令應發送檔案的Content-Encoding: gzip標頭.gz但是,.htaccessApache 可能不會處理檔案,具體取決于AllowOverride 指令的值。如果AllowOverride設定為None(并且AllowOverrideList 也是None,默認情況下是這種情況),則.htaccess忽略檔案。

請注意 的默認值AllowOverride

默認值:AllowOverride None(2.3.9 及更高版本)、AllowOverride All(2.3.8 及更早版本)

這意味著,從 Apache 2.3.9 開始,默認AllowOverride設定為None

您在評論中說您最近升級到了 2.4.6 版本。如果AllowOverride沒有在您的 Apache 配置中明確設定,那么它解釋了為什么您的.htaccess檔案不再有效。

一種解決方案是將其添加到您的 Apache 組態檔中:

<Directory /path/to/your/json/files/>
    AllowOverride All
</Directory>

uj5u.com熱心網友回復:

您可以在 ajax 回傳代碼中嘗試以下代碼:

  let blob = res.data;
  let reader = new FileReader();
  reader.readAsDataURL(blob);
  reader.onload = (e) => {
    let a = document.createElement("a");
    a.download = 'Your File Name';
    a.href = e.target.result;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
  };

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/498247.html

標籤:javascript php jQuery json 阿贾克斯

上一篇:ajaxpostasp.netcore3.1服務器端問題

下一篇:為什么我得到空的$_SESSION變數?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more