簡體   English   中英

如何將javascript變量作為$ _FILE發送到PHP服務器

[英]How to send javascript variable to PHP server as $_FILE

我們在服務器上有PHP代碼,它接收文件到$ _FILE,然后根據用戶/安全考慮因素存儲它們。

在客戶端上,我們當前可以按原樣將文件發送到服務器,或者我們希望在本地處理文件(在瀏覽器中的js內存中),然后將文件傳送到服務器。 我們可以使用JSON將處理后的文件發布到服務器,但是存在問題。

我們更希望將客戶端的javascript變量的內容發送到要在$ _FILE中接收的服務器。 (我們不能假設客戶端能夠在本地保存文件。)我們是否必須以某種方式模仿FORM提交?

如何發送一個javascript變量作為PHP $ _FILE接收?

謝謝!

更新 Blob肯定是正確的方向,但我們注意到Blob大小比輸入它的文件大50%。 $ _FILE中的文件也大50%。 我們已經嘗試在Blob創建時覆蓋文件類型,基於其他帖子,例如BlobBuilder廢棄二進制數據 ,但它沒有修復50%的大小增加。 我們根據收到的拖放文件類型設置Blob文件類型。 例如,我們上傳了一個900K的PDF文件。 類型類似於'application / pdf'。 得到的斑點就像1,400K。 也試過PNG。

如果客戶端支持Blob和XHR2( FormData ),那么你就是黃金。 假設您的數據保存在字符串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的文件,雖然這是一個有點復雜

基本上,您必須模仿multipart / form-data請求,並手動構建請求正文的各個部分。 不是很容易,但可行,並且應該與IE6-9一起使用。

我有一個類似的問題,有一點需要注意,我無法通過$ _FILE全局將文件發送到PHP,但我們可以使用$ _SERVER ['HTTP_X_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);
    }
}

在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'));
}

您需要將JS變量傳遞給UploadFile函數並為返回的數據編寫處理程序。

完成MaxArt的答案

在Php中接收數據的代碼是:

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

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

如果你在客戶端使用jQuery,那么jQuery Form Plugin也是通過Ajax上傳文件的好選擇,你可以通過PHP輕松獲得$_FILE 此插件還具有一些額外功能,可顯示文件上載的進度。

以下是該插件的演示: http//malsup.com/jquery/form/progress3.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM