Ajax-загрузка файлов устанавливает имя файла в случайную строку символов
Я пытаюсь загрузить файл с помощью ajax. Загрузка работает правильно, однако, имя загруженного файла устанавливается в случайную строку символов. Я не думаю, что это имеет значение, поскольку бэкенд работает, но я использую django
js/html:
<script>
function downloadFile(){
var filename = 'data.txt';
$.ajax({
url: 'downloadFile',
data: {'filename': filename},
success: function(blob, status, xhr){
var disposition = xhr.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') != -1){
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]){
filename = matches[1].replace(/['"]/g,'');
}
}
var bd = [];
bd.push(blob);
var typename = "application/" + filename;
var downloadURL = window.URL.createObjectURL(new Blob(bd, {type: typename}));
var a = document.createElement("a");
a.href = downloadURL;
document.body.append(a);
a.click();
}
});
}
</script>
...
<button id="downloadFile" type="button" onclick="downloadFile()"><i class="fa fa-download"></i></button>
...
django views.py:
import pathlib
import os
def downloadFile(request):
fname = request.GET.get('filename')
fpath = os.path.join(<local_filesystem_path>, fname)
# code to generate file here
if pathlib.Path(fpath).exists():
file_download = open(fpath, 'rb')
response = HttpResponse(file_download, content_type='application/{}'.format(fname))
response['Content-Disposition'] = 'attachment; filename="{}"'.format(fname)
return response
и urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('downloadFile', views.downloadFile, name='downloadFile')
]
Когда я нажимаю кнопку загрузки, все работает правильно, за исключением того, что мой файл был переименован в случайную строку из 8 символов. Каждый раз, когда я повторно загружаю его, строка меняется, но она всегда состоит из 8 символов. Я предполагаю, что происходит что-то, где мой браузер думает, что имя файла не задано, поэтому он присваивает случайную строку. Но я хотел бы установить его на что-то, что я указал - как я могу это сделать?
Попробуйте добавить атрибут download
к создаваемому тегу <a>
. Это позволит вам задать имя файла.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-download