AJAX下载后直接上传文件(无需存储)


AJAX Upload file straight after downloading it (without storing)

我正在制作一个JavaScript脚本,它将在所有者废弃(并失去所有游戏)之前基本上拯救一个旧的游戏开发沙盒网站。我已经创建了一个脚本,通过AJAX下载每个游戏,并希望以某种方式立即上传,也使用AJAX。如何将下载的文件(大概存储在responseText中)上传到另一个域(启用了跨源头)上的PHP页面?

我认为必须有一种方法从第一个AJAX请求上传数据,而不将responseText传输到另一个AJAX要求(用于上传文件)?我试过传输数据,但不出所料,这会导致巨大的延迟(并可能导致浏览器崩溃),因为文件可能相当大。

有没有一种方法可以让AJAX请求在收到单个数据包后立即上传?

谢谢,

丹。

您可以使用Firefox的moz-chunked-textmoz-chunked-arraybuffer响应类型。在JavaScript方面,你可以这样做:

function downloadUpload() {
  var downloadUrl = "server.com/largeFile.ext";
  var uploadUrl = "receiver.net/upload.php";
  var dataOffset = 0;
  xhrDownload = new XMLHttpRequest();
  xhrDownload.open("GET", downloadUrl, true);
  xhrDownload.responseType = "moz-chunked-text"; // <- only works in Firefox
  xhrDownload.onprogress = uploadData;
  xhrDownload.send();
  function uploadData() {
    var data = {
      file: downloadUrl.substring(downloadUrl.lastIndexOf('/') + 1),
      offset: dataOffset,
      chunk: xhrDownload.responseText
    };
    xhrUpload = new XMLHttpRequest();
    xhrUpload.open("POST", uploadUrl, true);
    xhrUpload.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
    xhrUpload.send(JSON.stringify(data));
    dataOffset += xhrDownload.responseText.length;
  };
}

在PHP方面,您需要这样的东西:

$in = fopen("php://input", "r");
$postContent = stream_get_contents($in);
fclose($in); 
$o = json_decode($postContent);
file_put_contents($o->file . '-' . $o->offset . '.txt', $o->chunk);

这些片段只会给你一个基本的想法,你需要自己优化代码。