Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

290
Views
File corrupted when using send_file() from flask, data from pymongo gridfs

Well my English is not good, and the title may looks weird.

Anyway, I'm now using flask to build a website that can store files, and mongodb is the database.

The file upload, document insert functions have no problems, the weird thing is that the file sent from flask send_file() was truncated for no reasons. Here's my code

from flask import ..., send_file, ...
import pymongo
import gridfs

#...

@app.route("/record/download/<record_id>")
def api_softwares_record_download(record_id):
    try:
        #...
        file = files_gridfs.find_one({"_id": record_id})
        file_ext = filetype.guess_extension(file.read(2048))
        filename = "{}-{}{}".format(
            app["name"],
            record["version"],
            ".{}".format(file_ext) if file_ext else "",
        )
        response = send_file(file, as_attachment=True, attachment_filename=filename)
        return response
    except ...

The original image file, for example, is 553KB. But the response body returns 549.61KB, and the image was broken. But if I just directly write the file to my disk

#...
with open('test.png', 'wb+') as file:
    file.write(files_gridfs.find_one({"_id": record_id}).read())

The image file size is 553KB and the image is readable.

When I compare the two files with VS Code's text editor, I found that the correct file starts with �PNG, but the corrupted file starts with �ϟ8���>�L�y

search the corrupted file head in the correct file

And I tried to use Blob object and download it from the browser. No difference.

Is there any wrong with my code or I misused send_file()? Or should I use flask_pymongo?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

And it's interesting that I have found what is wrong with my code.

This is how I solved it

...file.read(2048)
file.seek(0)
...
file.read(2048)
file.seek(0)
...
response = send_file(file, ...)
return response

And here's why:

For some reasons, I use filetype to detect the file's extension name and mime type, so I sent 2048B to filetype for detection.

file_ext = filetype.guess_extension(file.read(2048))
file_mime = filetype.guess_mime(file.read(2048)) #this line wasn't copied in my question. My fault.

And I have just learned from the pymongo API that python (or pymongo or gridfs, completely unknown to this before) reads file by using a cursor. When I try to find the cursor's position using file.seek(), it returns 4096. So when I call file.read() again in send_file(), the cursor reads from 4096B away to the file head. 549+4=553, and here's the problem.

Finally I set the cursor to position 0 after every read() operation, and it returns the correct file.

Hope this can help if you made the same mistake just like me.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!