上传文件(图像)在实时服务器上不起作用,但在dev上工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上传文件(图像)在实时服务器上不起作用,但在dev上工作相关的知识,希望对你有一定的参考价值。

无法绕过这个。以下代码适用于我的本地计算机,但在将站点上载到服务器后,我似乎没有收到请求中的文件。

这是我的ajax:

dialogUploadPhoto.find('form').submit(function(event) {
    event.preventDefault();
    $.ajax({
        type: $(this).attr('method'),
        url: $(this).attr('action'),
        data: $(this).serializeForm(), // method below...
        // data: formData,
        processData: false,
        contentType: false,
        cache: false,
        success: function(response) {
            // The response has the correct date on my local server
            dialogUploadPhoto.dialog( "close" );
        },
        error: function (xhr, desc, err){
            // On the live server, the debugger hits
        }
    });
});

serializeForm方法只是一个jquery方法,可以将所有字段附加到FormData实例中:

$.fn.serializeForm = function() {
    var form = $(this),
        formData = new FormData();
    var formParams = form.serializeArray();

    $.each(form.find('input[type="file"]'), function(i, tag) {
        $.each($(tag)[0].files, function(i, file) {
            formData.append(tag.name, file);
        });
    });

    $.each(formParams, function(i, val) {
        formData.append(val.name, val.value);
    });

    return formData;
};

处理表单的symfony控制器方法如下所示:

/**
 * Matches /admin/upload/foto
 * @Route(
 *     "/upload/foto",
 *     options={"expose": true},
 *     name="admin_upload_foto")
 * @Method({"POST"})
 * @return JsonResponse
 */
public function upload_photo(
    Request $request
) {
    $response = new JsonResponse();

    $newPhoto = new Fotos();
    $photoForm = $this->createForm(PhotoType::class, $newPhoto);
    $photoForm->handleRequest($request);

    if ($photoForm->isSubmitted() && $photoForm->isValid()) {
        // This part is hit on the dev server
    } else if ($photoForm->isSubmitted()) {
        // This part is hit on the live server!
        // categorie contains no errors
        $photoForm['categorie']->getErrors()->__toString());
        // file contains an error: content-type is null;
        $photoForm['file']->getErrors()->__toString());
        $response->setStatusCode(400);
        $response->setData(array("result" => 0, "errors" => $errors));
    } else {
        $response->setStatusCode(400);
        $response->setData(array("result" => 0, "errors" => "Het foto-formulier is niet verzonden naar de server"));
    }
    return $response;
}

特定错误表明文件上载文件的mime类型为null。这是否意味着永远不会发送文件?如果我这样做:formData.getAll('file')我可以看到文件实际上在包里。

在Chrome的网络分析器中,我可以看到有效负载确实包含了文件,也许它在途中丢失了?

按要求这是实时服务器上$ _FILES的var_dump

array(1) {
  ["photo"]=>
  array(5) {
    ["name"]=>
    array(1) {
      ["file"]=>
      string(8) "test.png"
    }
    ["type"]=>
    array(1) {
      ["file"]=>
      string(9) "image/png"
    }
    ["tmp_name"]=>
    array(1) {
      ["file"]=>
      string(14) "/tmp/phpwy5m9y"
    }
    ["error"]=>
    array(1) {
      ["file"]=>
      int(0)
    }
    ["size"]=>
    array(1) {
      ["file"]=>
      int(25745)
    }
  }
}

任何帮助,将不胜感激

答案

找到了解决方案,但我不得不放弃自动mime类型检查。

根据symfony documentation,我不应该关心文件存储为字符串。应该通过symfony正确“猜测”mime类型检查,但mime类型的Assert规则不会获取上传文件的mime类型。

我删除了mimetype断言规则并使用手动扩展检查更改了我的处理方法如下:

    $newPhoto = new Fotos();
    $photoForm = $this->createForm(PhotoType::class, $newPhoto);
    $photoForm->handleRequest($request);
    //        var_dump($photoForm->getData());
    if ($photoForm->isSubmitted() && $photoForm->isValid()) {
        // $file stores the uploaded PDF file
        /* @var $file UploadedFile */
        $file = $newPhoto->getFile();
        $fileExtension = $file->guessClientExtension();
    //            var_dump($file->guessClientExtension());
        if (($fileExtension === 'png' || $fileExtension === 'jpeg' || $fileExtension === 'jpg')) {
           // Now I know the extension matches the type of files I want to handle
        } else {
           // Now I know the uploaded file is an invalid type
        }
    }

以上是关于上传文件(图像)在实时服务器上不起作用,但在dev上工作的主要内容,如果未能解决你的问题,请参考以下文章

require_once在实时服务器上不起作用

VueJs 路由器链接在实时服务器上不起作用

iframe 文件上传在 IE 上不起作用

PHP Captcha 在服务器上不起作用,但在本地工作

颤振图像上传在真实设备上不起作用,虽然它适用于模拟器

FileUpload.PostedFile.SaveAs() 在实时网站 asp.net 上不起作用