$_files 在 Phonegap/Cordova 中的图像上传中为空 [关闭]

Posted

技术标签:

【中文标题】$_files 在 Phonegap/Cordova 中的图像上传中为空 [关闭]【英文标题】:$_files is empty in image upload in Phonegap/Cordova [closed] 【发布时间】:2016-11-09 19:49:01 【问题描述】:

现在快 6 天了,我正在尝试修复 cordova-php 中的图像上传问题,但无法修复。我尝试了 Google 和 Stack Overflow 的多种解决方案。但它们都不适合我。

我使用下面的代码作为前端。

<div>
    <h3>Server URL for upload.php:</h3>
    <input id="serverUrl" type="text" value="http://sample.com/mobile_app/upload_img.php" />
</div>
<script type="text/javascript" charset="utf-8">

    var deviceReady = false;
    /**
     * Take picture with camera
     */
    function takePicture() 
        navigator.camera.getPicture(
            function(uri) 
                var img = document.getElementById('camera_image');
                img.style.visibility = "visible";
                img.style.display = "block";
                img.src = uri;
                document.getElementById('camera_status').innerhtml = "Success";
            ,
            function(e) 
                console.log("Error getting picture: " + e);
                document.getElementById('camera_status').innerHTML = "Error getting picture.";
            ,
             quality: 50, destinationType: navigator.camera.DestinationType.FILE_URI);
    ;
    /**
     * Select picture from library
     */
    function selectPicture() 
        navigator.camera.getPicture(
            function(uri) 
                var img = document.getElementById('camera_image');
                img.style.visibility = "visible";
                img.style.display = "block";
                img.src = uri;
                document.getElementById('camera_status').innerHTML = "Success";
            ,
            function(e) 
                console.log("Error getting picture: " + e);
                document.getElementById('camera_status').innerHTML = "Error getting picture.";
            ,
             quality: 50, destinationType: navigator.camera.DestinationType.FILE_URI, sourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY);
    ;

    /**
     * Upload current picture
     */
    function uploadPicture() 

        // Get URI of picture to upload
        var img = document.getElementById('camera_image');
        var imageURI = img.src;
        if (!imageURI || (img.style.display == "none")) 
            document.getElementById('camera_status').innerHTML = "Take picture or select picture from library first.";
            return;
        

        // Verify server has been entered
        server = document.getElementById('serverUrl').value;
        if (server) 

            // Specify transfer options
            var options = new FileUploadOptions();
            options.fileKey="fileUpload";
            options.httpMethod="POST";
            options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);
            options.mimeType="image/jpeg";
            options.chunkedMode = false;
  //          var op;
//op = new FileUploadOptions();

            options.headers = 
               Connection: "close"
            ;
            // Transfer picture to server
            var ft = new FileTransfer();
            ft.upload(imageURI, server, function(r) 
                document.getElementById('camera_status').innerHTML = "Upload successful: "+r.response+" bytes uploaded."; alert(r.response);            
            , function(error) 
                alert(r.response);
                document.getElementById('camera_status').innerHTML = "Upload failed: Code = "+error.code;               
            , options);
        
    
    /**
     * View pictures uploaded to the server
     */
    function viewUploadedPictures() 

        // Get server URL
        server = document.getElementById('serverUrl').value;
        if (server) 

            // Get HTML that lists all pictures on server using XHR 
            var xmlhttp = new XMLHttpRequest();
            // Callback function when XMLHttpRequest is ready
            xmlhttp.onreadystatechange=function()
                if(xmlhttp.readyState === 4)
                    // HTML is returned, which has pictures to display
                    if (xmlhttp.status === 200) 
                        document.getElementById('server_images').innerHTML = xmlhttp.responseText;
                    
                    // If error
                    else 
                        document.getElementById('server_images').innerHTML = "Error retrieving pictures from server.";
                    
                
            ;
            xmlhttp.open("GET", server , true);
            xmlhttp.send();         
           
    

    /**
     * Function called when page has finished loading.
     */
    function init() 
        document.addEventListener("deviceready", function() deviceReady = true;, false);
        window.setTimeout(function() 
            if (!deviceReady) 
                alert("Error: PhoneGap did not initialize.  Demo will not run correctly.");
            
        ,2000);
    
    </script>

这里是后端 (PHP) 代码。

<?php
header("Access-Control-Allow-Origin: *");
//header("Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS");
header("content-type: image/png");
// Directory where uploaded images are saved
$dirname = "user_img";//"mobile_app/user_img"; 
var_dump($_POST);
$new_image_name = urldecode($_FILES["fileUpload"]["name"]).".png";
// If uploading file
//echo $_FILES;
echo $new_image_name;
 print_r($_FILES["fileUpload"]);
if ($_FILES) 
    print_r($_FILES);
    //mkdir ($dirname, 0777, true); 
    move_uploaded_file($_FILES["fileUpload"]["tmp_name"],$dirname."/".$_FILES["fileUpload"]["name"]);

// If retrieving an image
else if (isset($_GET['image'])) 
    $file = $dirname."/".$_GET['image'];
    // Specify as jpeg
    header('Content-type: image/jpeg');

    // Resize image for mobile
    list($width, $height) = getimagesize($file); 
    $newWidth = 120.0; 
    $size = $newWidth / $width;
    $newHeight = $height * $size; 
    $resizedImage = imagecreatetruecolor($newWidth, $newHeight); 
    $image = imagecreatefromjpeg($file); 
    imagecopyresampled($resizedImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 
    imagejpeg($resizedImage, null, 80); 

// If displaying images
else 
    $baseURI = "http://".$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI'];
    $images = scandir($dirname);
    $ignore = Array(".", "..");
    if ($images) 
        foreach($images as $curimg) 
            if (!in_array($curimg, $ignore)) 
                echo "Image: ".$curimg."<br>";
                echo "<img src='".$baseURI."?image=".$curimg."&rnd=".uniqid()."'><br>"; 
            
        
    
    else 
        echo "No images on server";
    

?>

我发现$_FILES 是空的,我只得到 Array()。我不知道代码有什么问题,因为我在多个问题和示例中看到了相同的代码。

我使用了两个 Web 服务器,但结果相同。

user_img 文件夹有 777 权限。

【问题讨论】:

request 内容类型是什么? (var_dump($_SERVER['HTTP_CONTENT_TYPE']);) 我得到 NULL。我添加了 header("content-type: image/jpeg");在标题中,但它仍然为空。 【参考方案1】:

最后我解决了这个问题,解决起来很简单。

我给的网址是http://sample.com/upload_img.php。我只需要在网址中添加 www 。所以,工作 URL 是http://www/sample.com/upload_img.php。 它解决了这个问题。

【讨论】:

这是duplicate of your answer here。

以上是关于$_files 在 Phonegap/Cordova 中的图像上传中为空 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

?dirname(__FILE__)

我可以在调用者处将函数参数默认为 __FILE__ 的值吗?

如何在预处理器时附加到 __FILE__ 并包含结果

获取堆栈中上一级函数的 __file__

__FILE__、__LINE__ 和 __FUNCTION__ 在 C++ 中的用法

如何让__FILE __,__ func__和__LINE__宏在单行中工作?