如何使用javascript将文件从URL(不是文件上载)发送到后端?

如何使用javascript将文件从URL(不是文件上载)发送到后端?,javascript,Javascript,我想有一个按钮,当点击时,从同一个域上的(预定义)URL获取一个文件(在本例中是动态生成的PDF),并将其发送到(php)后端保存 我猜最好的方法是以某种方式将URL返回的文件加载到javascript变量中,对其进行base64编码,并使用ajax POST将其发送到后端。然后在后端,我将base64解码并将其保存为常规文件 这是正确的方法,还是有更好的方法 如果这是正确的方法,那么我不确定该如何做的部分就是将文件从URL获取到一个变量中。一旦它出现,我想我可以使用btoa()对它进行base

我想有一个按钮,当点击时,从同一个域上的(预定义)URL获取一个文件(在本例中是动态生成的PDF),并将其发送到(php)后端保存

我猜最好的方法是以某种方式将URL返回的文件加载到javascript变量中,对其进行base64编码,并使用ajax POST将其发送到后端。然后在后端,我将base64解码并将其保存为常规文件

这是正确的方法,还是有更好的方法

如果这是正确的方法,那么我不确定该如何做的部分就是将文件从URL获取到一个变量中。一旦它出现,我想我可以使用
btoa()
对它进行base64编码。另一件我不能100%确定的事情是,当我解码它时,它是否与PHP中的
base64\u decode()
兼容?

Update 你说,URL是预定义的,你不知道如何进入javascript变量。我想,URL是在后端(PHP)中定义的。因此,您可以简单地使用PHP将其设置/注入到客户端代码(javascript)中。 不要将URL从客户端发回服务器,因为似乎没有必要这样做,而且用户很容易更改URL(安全问题)

因此,也许更好的方法是将URL保留在服务器端,并使用php将其注入客户端页面,而不将其发回服务器

原始答案 此答案仅适用于客户端生成URL,并且您有一种安全的方法来验证该URL,因为每个客户端输入都必须被视为潜在的有害用户输入

我认为这是绝对正确的方法。是的,您应该对变量进行base64编码。您可以将base64编码的字符串放入json对象中,并通过ajax发布此json对象,或者将其作为纯文本发布到帖子正文中。确保将其作为客户端输入进行验证


我看不出为什么btoa()/base64_decode()不起作用。Base64是独立于平台的。

我想出来了。它是vanilla和jQuery的混合体,因为vanilla来自,我正在从事的项目已经有jQuery可用于
$.ajax
,以便更轻松地发布到后端

var oReq = new XMLHttpRequest();
var fileUrl = '[URL from PHP]';
oReq.open("GET", fileUrl, true);
oReq.responseType = "arraybuffer";

oReq.onload = function (oEvent) {
  let arrayBuffer = oReq.response; // Note: not oReq.responseText
  if (arrayBuffer) {
    let binaryText;
    let byteArray = new Uint8Array(arrayBuffer);
    for (var i = 0; i < byteArray.byteLength; i++) {
      binaryText+=String.fromCharCode( byteArray[ i ] );
    }
    $.ajax({
      type: "POST",
      url: "/path/to/backend-upload",
      data: {"fileData":btoa(binaryText)},
      success: function(resultData){
          alert("File Uploaded");
      }
    });
  }
};

oReq.send(null);

由于服务器体系结构/权限设置,我无法轻松注入它。PDF是根据用户的权限生成的,最简单的生成方法是模拟用户的https调用,而我在服务器端无法做到这一点(据我所知)。在您最初的回答中,我仍然不确定如何将PDF从URL转换为javascript变量。URL值在哪里?URL是在服务器端动态生成的。我知道安全问题,但在我尝试这样做的特定上下文中,它们的影响最小(为了简化事情,我在原始帖子中省略了这些内容)。要了解更多上下文,当前用户必须使用PDF访问URL,将其下载到他们的计算机,返回此页面,使用文件上载输入上载PDF(因为他们也可以上载其他文件)。我想让他们通过点击按钮,让javascript获取PDF并“上传”它来实现同样的效果。此外,我刚刚意识到了一个沟通错误-我可以将URL本身转换为javascript变量没有问题,但是我想调用URL并将文件从URL中获取到变量中,这样我就可以对其进行base64编码并将其发送到后端。这就是我的问题所在,抱歉给你带来困惑。
file_put_contents("/path/to/destination", base64_decode($_POST['fileData']));