У меня уже есть эта проблема, когда вы делаете запрос файла в ajax, вам нужно обработать ответ, это мой код:
this.$http.get(URL.SENSOR_DATA_DOWNLOAD, {
params: this.getParms
},
).then(function (response) {
try {
let headerLine = response.headers['content-disposition'];
let startFileNameIndex = headerLine.indexOf('"') + 1;
let endFileNameIndex = headerLine.lastIndexOf('"');
let filename = headerLine.substring(startFileNameIndex, endFileNameIndex);
const type = response.headers['content-type'];
const blob = new Blob([response.data], {type: type, encoding: 'UTF-8'});
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = filename;
link.click();
} catch (e) {
console.log(e);
}
this.loading = false;
}).catch(() => {
this.loading = false;
});
Я использую топор ios, но ответный обратный вызов такой же, как у ajax (часть then(function (response)
). В основном я получаю имя файла и данные файла (часть блоба) и помещаю это в ссылку для автоматической загрузки. Если вам тоже нужна внутренняя часть (я использую flask -csv в этом примере):
@api.resource('/sector/machine/sensor/data/download')
class DataDownloadAPI(Resource):
method_decorators = [login_requeried]
@validateInput(DownloadDataForm)
def get(self):
form = ApiWrap.form
mintime = datetime.min.time()
datetime_out = datetime.combine(form.date_out.data + timedelta(days=1), mintime)
datetime_in = datetime.combine(form.date_in.data, mintime)
dataStructs = DataModel.between(form.sensor_id.data, datetime_in, datetime_out)
sensor = Sensor.query.filter_by(id=form.sensor_id.data).first()
for dataStruct in dataStructs.data:
dataStruct['datetime'] = dataStruct['datetime'].strftime("%d/%m/%Y, %H:%M:%S")
dataStruct['value'] = (dataStruct['value'] * sensor.resolution) + sensor.offset
return send_csv(dataStructs.data,
sensor.name + datetime_out.strftime("%d/%m/%Y") + '.csv',
['datetime', 'value'], delimiter=';')