如何将javascript变量作为$\文件发送到PHP服务器

如何将javascript变量作为$\文件发送到PHP服务器,javascript,php,Javascript,Php,我们在服务器上有PHP代码,它将文件接收到$\文件中,然后基于用户/安全考虑将其存储 在客户端上,我们当前可以按原样将文件发送到服务器,或者我们希望本地处理文件(在浏览器的js内存中),然后将文件发送到服务器。我们可以使用JSON将处理后的文件发布到服务器,但是这有问题 我们更希望将客户端javascript变量的内容发送到服务器,以便在$u文件中接收。(我们不能假设客户将有能力在本地保存文件。)我们是否必须以某种方式模拟表单提交 如何发送一个javascript变量作为PHP$\文件接收 谢谢

我们在服务器上有PHP代码,它将文件接收到$\文件中,然后基于用户/安全考虑将其存储

在客户端上,我们当前可以按原样将文件发送到服务器,或者我们希望本地处理文件(在浏览器的js内存中),然后将文件发送到服务器。我们可以使用JSON将处理后的文件发布到服务器,但是这有问题

我们更希望将客户端javascript变量的内容发送到服务器,以便在$u文件中接收。(我们不能假设客户将有能力在本地保存文件。)我们是否必须以某种方式模拟表单提交

如何发送一个javascript变量作为PHP$\文件接收

谢谢

更新 Blob显然是正确的方向,但我们注意到Blob的大小比进入它的文件大50%。$\文件中的文件也要大50%。 我们已经尝试在Blob创建时重写文件类型,基于其他帖子,例如,但是它没有修复大小增加50%的问题。我们正在根据收到的拖放文件类型设置Blob文件类型。例如,我们上传了一个900K的PDF文件。类型类似于“application/pdf”。由此产生的水滴大约为1400k。也尝试了PNG

如果客户端支持和XHR2(),那么您就是黄金。假设您的数据保存在字符串
data
中,您所要做的就是

// Set the file media type appropriately
var blob = new Blob([ data ], { type: "image/png" });

var formData = new FormData();
formData.append("theFile", blob, "filename.png");

var xhr = new XMLHttpRequest();
xhr.open("POST", "/destination");
xhr.send(formData);
xhr.onload = function() {
    // ...
};
更新:如果您的客户机不支持XHR2,那么有一种方法可以仅使用AJAX发送文件,尽管它很简单


基本上,您必须模拟多部分/表单数据请求,并手动构建请求主体的各个部分。不是很容易,但可行,应该与IE6-9一起工作。

完成MaxArt的答案

用Php接收数据的代码如下:

$file = $_POST['theFile'];//sent from javascript
$filePath = "/your_destination_directory/filename.ext";

if(file_put_contents($filePath,$file))
{
    //OK
}else{
    //ERROR
}

如果您在客户端使用jQuery,那么通过Ajax上传文件也是一个不错的选择,您可以通过PHP轻松获得
$\u文件。这个插件还有一些额外的功能来显示文件上传的进度


下面是该插件的演示:

我在前一段时间遇到了类似的问题,需要注意的是,我无法通过$\u文件全局将该文件发送到PHP,但我们可以使用$\u服务器['HTTP\u X\u FILENAME']执行完全相同的操作。我编写了以下JS函数

function UploadFile(file) {
    var xhr = new XMLHttpRequest();
    if (xhr.upload && file.size <= $id("MAX_FILE_SIZE").value)
    {
        // start upload
        xhr.open("POST", $id("upload").action, true);
        xhr.setRequestHeader("X-FILENAME", file.name);
        xhr.onload = function(e) {
            if (this.status == 200) {
                ... Some processing script for returning messages
            }
        };
        xhr.send(file);
    }
}

您需要将JS变量传递到UploadFile函数中,并为返回的数据编写一个处理程序。

Blob
的第二个参数可能应该是
{type:“image/png”}
如果我理解正确,文件将以$\u POST而不是$\u文件的形式到达。我希望它以$u文件的形式出现,这样我们就不必修改服务器代码了。然而,这种方法似乎比我们的base64编码和通过JSON传输的替代策略要好。@MarkKasson否,当
文件
Blob
对象被删除时,它将作为文件发送,并被php视为文件。另请参见。令人失望的是,听说没有办法将其显示在$_文件中-这正是我们希望实现的目标。我可能错了,但这似乎是用于上载存储在磁盘上的文件。我们的不是——它们存储在内存中的一个变量中,我不想将它们存储在文件中。
$fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);
if ($fn) {
    $file = "desired location/" . $fn;
    file_put_contents($file,file_get_contents('php://input'));
}