#reactjs #django #api #django-views #zip
#reactjs #django #API #django-просмотры #zip
Вопрос:
Заранее спасибо за просмотр. Я работаю над возможностью загрузки zip-файла из react через запрос API django. Я могу щелкнуть по своему всплывающему окну, которое загружает zip-файл, но когда я дважды щелкаю по zip-файлу, чтобы открыть, я получаю эту ошибку: «Невозможно развернуть file_name.zip . Это неподдерживаемый формат» Мой ответ с zip-файлом, похоже, правильно передается во внешний интерфейс, поэтому я думаю, что может быть что-то не так с кодом react при создании «blob»? Еще раз спасибо.
Код Django:
class DownloadZip(APIView):
def post(self, request, format=None):
# information to find file to create zip
profile_name = request.data["profile"]
profile_year = request.data["year"]
# file path to create zips from
path = str(Path(__file__).parent.resolve())
zip_dir = shutil.make_archive(profile_name profile_year, "zip", path "/" profile_name profile_year)
s = io.StringIO(zip_dir)
response = HttpResponse(s, content_type = "application/zip")
zip_name = profile_name profile_year ".zip"
response["Content-Disposition"] = f"attachment; filename={zip_name}"
return response
Код реакции:
downloadZip = async () => {
const params = {
profile: this.state.profileName,
year: this.state.year,
};
axios({
url: `${serverUrl}/download_zip`,
method: "post",
data: params
}).then(
(res) => {
const url = window.URL.createObjectURL(new Blob([res.data],{type:'application/zip'}));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'file.zip');
document.body.appendChild(link);
link.click();
link.parentNode.removeChild(link);
},
(error) => {
console.log(error);
});
}
Я сделал предложение другого комментатора и обновил, чтобы получить маршрут с параметрами запроса, но у меня такая же проблема. Я могу дважды щелкнуть по ссылке zip в веб-браузере, но появляется всплывающее окно «Невозможно развернуть filename.zip . Это неподдерживаемый формат «
Комментарии:
1. Странно, что вы используете метод HTTP post для загрузки файла, вместо этого используйте HTTP GET
2. К сожалению, мне приходится просматривать некоторые данные, чтобы найти файл, соответствующий выбранным параметрам, чтобы вернуть правильный zip. Get не работает с передачей этих данных через
3. Вы можете использовать параметры запроса
4. Я попытаюсь это сделать и обновлю, если это устранит проблему. Спасибо!
5. @ArakkalAbu Я изменил его, чтобы получить с параметрами запроса, получив ту же ошибку
Ответ №1:
Пожалуйста, попробуйте добавить {responseType: ‘arraybuffer’} . У меня также была такая же проблема, но после добавления этого {responseType: ‘arraybuffer’} . Я получаю правильный файл.
downloadZip = async () => {
const params = {
profile: this.state.profileName,
year: this.state.year,
};
axios.post(
`${serverUrl}/download_zip`,
params,
{
responseType: 'arraybuffer'
}
).then(
(res) => {
const url = window.URL.createObjectURL(new Blob([res.data],{type:'application/zip'}));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', 'file.zip');
document.body.appendChild(link);
link.click();
link.parentNode.removeChild(link);
},
(error) => {
console.log(error);
});
}