Tengo un archivo zip en mi servidor y quiero crear un botón de descarga para el usuario, aquí está el código de mi matraz:
@app.route("/profile", methods=["GET", "POST"]) def profile(): if request.method == "GET": return render_template("profile.html") if request.method == "POST": #Some code return send_file(f"user_projects/delivery.zip")Y aquí está mi código JS:
xhr.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { if (something) { some code } else { var zipFile = new Blob([this.response]) var url = URL.createObjectURL(zipFile) downloadLink.href = url; } } }Cuando hago clic en el elemento "a" (downloadLink) puedo descargar el archivo zip, pero cuando trato de abrirlo aparece un error que dice:
ERRORES: No es archivo ADVERTENCIAS: Error de encabezados
El archivo zip del servidor está 100% bien, puedo abrirlo sin ningún problema, el problema es cuando lo descargo de mi sitio web, así que creo que hay algo que doy por sentado. Cualquier ayuda es apreciada, gracias.
Tengo que resolver el problema siguiendo esta respuesta y ahora puedo descargar el archivo zip, solo para que conste:
Modifiqué el código del servidor, tuve que abrir el archivo como binario y codificarlo en base64:
with open(f"user_projects/delivery.zip", mode="rb") as binaryFile: binaryFile = binaryFile.read() archivoEnBase64 = base64.b64encode(binaryFile) return archivoEnBase64Aquí está el código JS modificado:
var zipFile = new Blob([atob(this.response)], {"type": "application/zip"}) var url = URL.createObjectURL(zipFile) downloadLink.href = "data:application/zip;base64," + this.response;La respuesta a la solicitud es una cadena de bytes, así que la decodifiqué con atob() y el atributo href usa el esquema URI de datos:
datos:[tipo de medio][;base64],datos