简体   繁体   English

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

[英]Uploading a file (image) doesn't work on live server but works on dev

Can't wrap my head around this. 我无法解决这个问题。 The following code works on my local computer but after uploading the site to the server I don't seem to receive the file in the request. 以下代码在我的本地计算机上可用,但是将站点上传到服务器后,我似乎没有在请求中收到文件。

This is my ajax: 这是我的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
        }
    });
});

The serializeForm method is just a jquery method to append all fields into a FormData instance: serializeForm方法只是一个将所有字段附加到FormData实例的jquery方法:

$.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;
};

The symfony controller method that handles the form looks like this: 处理表单的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;
}

The specific error states that the file uploaded file's mime type is null. 特定错误指出文件上传文件的mime类型为null。 Does that mean the file is never sent? 这是否意味着该文件永远不会发送? If I do this: formData.getAll('file') I can see that the file is actually in the bag. 如果我这样做: formData.getAll('file')我可以看到文件实际上在包里。

In Chrome's network profiler I can see that the payload does include the file, maybe it is lost along the way? 在Chrome的网络分析器中,我可以看到有效载荷确实包含该文件,也许它在途中丢失了?

As requested Here is the var_dump of $_FILES on the live server 根据要求,这是实时服务器上$ _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)
    }
  }
}

Any help would be appreciated 任何帮助,将不胜感激

Found a solution but I had to ditch automatic mime type checking for it. 找到了解决方案,但我不得不放弃自动mime类型检查。

As per symfony documentation I shouldn't care about the file being stored as a string. 根据symfony文档,我不关心文件存储为字符串。 The mime type checking should be 'guessed' correctly by symfony but the Assert rule for mime types doesn't pick up the mime type of the uploaded file. symfony应该正确地“猜测”了哑剧类型检查,但是针对哑剧类型的“断言”规则不会选择上载文件的哑剧类型。

I removed the mimetype assert rule and changed my handling method as follows using manual extension checking: 我删除了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
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM