我想下载任何格式的文件即。 pdf,jpeg,png,xlsx,csv等。使用金字塔框架的后端下载API正在发送FileResponse,如下所示:
def delivery_item_download_view(request, *args, **kw):
context = request.context
item_row = context.item_row
if item_row and item_row["deleted_at"] is None:
print(request.upload_dir+'/'+item_row["file_name"]+'.'+item_row["file_extension"])
response = FileResponse(
request.upload_dir+'/'+item_row["file_name"]+'.'+item_row["file_extension"],
request=request,
)
response.headers["attachment"] = item_row["name"];
return response
这在使用POSTMAN执行时按预期工作,将文件作为输出。但是,当尝试使用ReactJS实现相同时,它没有按预期工作。我的客户端代码如下:
onDownloadItem= (item) => {
console.log("item id is:", item.item_id)
var apiBaseUrl = "https://dev.incodax.com/api/deliveries_items/"+ item.item_id+ "/download";
fetch(apiBaseUrl, {
method: "GET",
}).then((res) => {
fileDownload(res,item.file_name)
console.log(res)
})
}
此文件下载功能只是下载文件但内容没有内容。在下载的文件中,我可以看到类似的内容:
[object Response]
我从服务器得到200回复。所以我不认为服务器端代码有任何问题。我怎样才能在客户端处理它?</ p>
提前致谢
答案 0 :(得分:0)
如果您只是将用户重定向到链接到文件,它会适合您吗?浏览器将自动处理并下载它。
答案 1 :(得分:0)
问题出在fileDownload
函数中,您不在此处发布。目前尚不清楚第一个参数应该是什么,但可能不是响应对象。可能你至少需要将身体从反应中拉出来并保存!响应主体可以转换为可以工作的缓冲区对象(同样取决于fileDownload
期望的内容):
res.arrayBuffer().then(buffer => {
fileDownload(buffer, item.file_name);
});