I have recently gone live with a system that uploads CV's and I am getting an unusually high number of rejections, approximately 15%. When I look at the log it shows me the following results:
- The extension reported by the client is
docx
(based on$file->getClientOriginalExtension()
) - The MIME type reported by the client is
application/vnd.openxmlformats-officedocument.wordprocessingml.document
(based on$file->getClientMimeType()
) - Laravel/PHP detects that the files are
.bin
(based on$file->extension()
)
In other words, the client says it is uploading a docx file, but the server says it receives a bin. At first I thought it was simply corruption, but it occurs far to often.
I have only captured a few in the logs so far, but I note that each time Safari has been the browser. Are there any systemic issues with Safari? If so, how do I get around them?
What else could cause the problem?
I am triggering the form submit with Vue, but I don't see how that could make a difference. Here is the Vue code:
document.getElementById("new-application").submit();
Safari is known for it's mime types, that are not correct. I'm sure in your case, it isn't sending docx mime like it should, but instead it is saying it is
octet-stream
. Well, your only workaround is(if your file is not corrupted) to manually set extension of file to correct one or manually send file from browser, making sure the mime is correct.docx
is Microsoft Word Open XML Format Document, a XML-based and all the content is stored as separate files, and ultimately compacted in a single, ZIP-compressed file. It seems like a file container.And we should not take file extension as same with mimetype. As far as know a normal ( A mp4 file with docx should not take as normal ) file with
docx
file extension can has one of these mimetypes.In your code,
$file->getClientOriginalExtension()
extract extension from the original file name that was uploaded which should not be considered as a safe value.$file->getClientMimeType()
extract the mime type from client request which should not be considered as a safe value.Both these two functin implemented in
./vendor/symfony/http-foundation/File/UploadedFile.php
Then take a look at last function in your code,
$file->extension()
use some method to guess (which maybe not accurate) the file extension. In sequence php'sfinfo
(manual) which base on the file content, the systemfile
. As the below source code it's guess, so it's not accurate all the time. Refer to file command apparently returning wrong MIME type.Here you should get it. If you want to go further, see below source code of the function
extension
.Source Code
extension
callguessExtension
to guess the file extension, andguessExtension
use the mimetype returned byguessMiMeType
guessMiMeType
use two guesser to guess the mimetype. php'sfinfo
and system'sfile
, andfinfo
take high priority thanfile
.The problem was that PHP uses the
file
command from the OS (in this case Ubuntu) to guess the extension based on the contents of the file. It was getting it wrong. Upgrading Ubuntu would probably help.