0

我查看了许多关于将文件上传到远程目录(通过 GoDaddy 托管;Windows 机器)的问题的帖子,但未能成功实施这些更改。

这是我想要做的。我编写了一个非常简单的 PHP 来将本地 KML 文件上传到远程 GoDaddy 目录。我这样做是为了为 KML 创建一个面向公众的 URL,然后可以将其添加到我的 Google 地图应用程序中。

我做过的事情:

  • 确保权限允许“写入”到我上传到的目录。
  • 通过上传到我网站上的目录来测试 PHP。这可行,但该网站不是面向公众的(因此它不会在地图上覆盖 KML,因此我现在尝试上传到 GoDaddy)。
  • 重写了我的 AJAX 发布函数以使用不同的数据类型(显然这是其他 GoDaddy 用户在上传文件时的修复)
  • 将 .kml MIME 类型添加到 GoDaddy web.config

有什么作用:

  • 如果我使用 FTP 文件管理器,并在目录中手动放置 KML,它就可以访问并加载到我的地图上。
  • 显然 PHP 工作是因为我的 .done() 函数在尝试上传后触发。

我的限制是:

  • 我无法登录 GoDaddy 的客户经理,因为唯一知道此信息的人是我们的网站管理员(巧合的是他不在办公室)。
  • PHP,除了阅读教程、创建一个 Hello World 页面和一个邮件表单之外,我从来没有用它做过任何事情。

这是 AJAX 帖子:

$.ajax({
        url: 'http://www.example.com/dev/Drawings/upload.php',
        type: 'POST',
        processData: false,
        data: data,
        dataType: 'html'
    })
    .done(function () {
        dKML = new google.maps.KmlLayer('http://www.example.com/dev/Drawings/Uploads/' + filename);
        dKML.setMap(map);
    })
    .fail(function (xhr, errorType, exception) {
        var errorMessage = exception + "\n" + xhr.status + "\n" + errorType;
        alert(errorMessage);
    });

这是我的 PHP (upload.php):

<?php
header("Access-Control-Allow-Origin: *");
if ( !isset($_FILES['file'])) {
    die();
} else {
    $temp_file = $_FILES['file']['tmp_name'];
    move_uploaded_file($temp_file, "/Uploads/" . $_FILES['file']['name']);
}

?>

我一直犹豫要不要在这里发帖,因为我确信我可以解决这个问题,但老实说,我在无数小时的反复试验中迷失了方向。

我的问题是:

语法上有什么不正确的地方吗?

你们中是否有人遇到过类似的问题,如果有,你们能做些什么来解决这个问题?

是否存在问题,因为在测试上传时我使用的是 localhost?

先感谢您!

4

1 回答 1

0

一旦我发现 tmp_name 值为 null,我就开始寻找更好的错误处理来添加到我的 PHP 中。

我最终将我的 PHP 更改为:

`代码

<?php
    $error = "";
    $msg = "";
    $fileElementName = 'file';
    if(!empty($_FILES[$fileElementName]['error']))
    {
        switch($_FILES[$fileElementName]['error'])
        {

        case '1':
            $error = 'The uploaded file exceeds the upload_max_filesize directive in php.ini';
            break;
        case '2':
            $error = 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';
            break;
        case '3':
            $error = 'The uploaded file was only partially uploaded';
            break;
        case '4':
            $error = 'No file was uploaded.';
            break;
        case '6':
            $error = 'Missing a temporary folder';
            break;
        case '7':
            $error = 'Failed to write file to disk';
            break;
        case '8':
            $error = 'File upload stopped by extension';
            break;
        case '999':
        default:
            $error = 'No error code available';
    }
}elseif(empty($_FILES['file']['tmp_name']) || $_FILES['file']['tmp_name'] == 'none')
{
    $error = 'No file was uploaded..';
}else 
{
        $msg .= " File Name: " . $_FILES['file']['name'] . ", ";
        $msg .= " File Size: " . @filesize($_FILES['file']['tmp_name']);
        //for security reason, we force to remove all uploaded file
        @unlink($_FILES['file']);       
}       
echo "{";
echo                "error: '" . $error . "',\n";
echo                "msg: '" . $msg . "'\n";
echo "}";
?>

`

我还将表单上的 .submit() 函数更新为:

`代码

e.preventDefault();
var dataString;
var action = 'http://www.example.com/dev/Drawings/upload.php';
if ($("#form").attr("enctype") == "multipart/form-data") {
    dataString = new FormData($("#form").get(0));
    contentType = false;
    processData = false;
}
$.ajax({
    type: "POST",
    url: action,
    data: dataString,
    dataType: "html", 
    contentType: contentType,
    processData: processData
})
.done(function () {
    delay(function () {
        dKML = new google.maps.KmlLayer('http://www.example.com/dev/Drawings/Uploads/' + filename);
        dKML.setMap(map);
    }, 2000);
})
.fail(function (xhr, errorType, exception) {
    var errorMessage = exception + "\n" + xhr.status + "\n" + errorType;
    alert(errorMessage);
});

`

一旦我能够解析 PHP 中的 $_FILES 变量,一切都开始按预期工作。

于 2013-07-01T21:03:17.577 回答