首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从shopware 6 administration下载CSV

从shopware 6 administration下载CSV
EN

Stack Overflow用户
提问于 2022-08-26 11:43:06
回答 4查看 110关注 0票数 2

我想实现一个CSV导出从Shopware 6管理。我有一个按钮,想打开一个新窗口,得到一个CSV文件。

我实现了一个控制器:

代码语言:javascript
复制
/**
 * @Route(
 *     "/api/winkelwagen/export/csv/{id}",
 *     methods={"GET"},
 *     defaults={"auth_required"=true, "_routeScope"={"api"}}
 * )
 */
public function export(string $id, Context $context, Request $request): Response
{
    /** @var PromotionEntity $promo */
    $response->setContent('csv file');

    return $response;
}

但是要调用这个控制器,您需要登录,这完全是有意义的。

我的管理按钮当前打开一个新窗口并打开页面:

代码语言:javascript
复制
window.open('http://www.fabian-blechschmidt.de', '_blank');

当然,它不适用于api url,因为您需要进行身份验证。

因此,我的问题是:如何实现此身份验证并在后端获取CSV文件?:-)

也许我的方法完全失败了--很高兴得到一个更好的主意!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-08-26 13:01:55

为了扩展dneustadt的回答,下面的代码片段实际上也下载了csv作为一个文件,方法是将数据加载到数据url中并实际单击它。

代码语言:javascript
复制
const initContainer = Shopware.Application.getContainer('init');
initContainer.httpClient.get(
    `winkelwagen/export/csv/${id}`,
    {
        headers: {
            Accept: 'application/vnd.api+json',
            Authorization: `Bearer ${Shopware.Service('loginService').getToken()}`,
            'Content-Type': 'application/json',
        },
    },
).then((response) => {
    if (response.data) {
        const filename = response.headers['content-disposition'].split('filename=')[1];
        const link = document.createElement('a');
        link.href = URL.createObjectURL(response.data);
        link.download = filename;
        link.dispatchEvent(new MouseEvent('click'));
        link.parentNode.removeChild(link);
    }
});
票数 1
EN

Stack Overflow用户

发布于 2022-08-26 12:34:57

您可以使用内置的http客户端并设置用于身份验证的承载令牌:

代码语言:javascript
复制
const initContainer = Shopware.Application.getContainer('init');
initContainer.httpClient.get(
    `winkelwagen/export/csv/${id}`,
    {
        headers: {
            Accept: 'application/vnd.api+json',
            Authorization: `Bearer ${Shopware.Service('loginService').getToken()}`,
            'Content-Type': 'application/json',
        },
    },
);

根据您的需要更改标题。

票数 1
EN

Stack Overflow用户

发布于 2022-08-26 18:05:40

是个很好的开始!但是Rune Laenen的回答是金的!

但我认为,由于我不返回JSON,而是返回CSV文件,我需要更改一些东西。

  • 由于某种原因,文件名包含了"作为前缀和后缀--我们删除了这些。
  • response.data response.data既不是文件也不是Blob,这是URL.createObjectURL所需要的-没问题,我们只是创建一个。
  • 和链接似乎没有附加到文档,所以我们确保不会抛出

代码语言:javascript
复制
     if (response.data) {
        let filename = response.headers['content-disposition'].split('filename=')[1];
        filename = filename.substring(1, filename.length - 1);
        const link = document.createElement('a');
        link.href = URL.createObjectURL(new Blob([response.data], {type: response.headers['content-type']}));
        link.download = filename;
        link.dispatchEvent(new MouseEvent('click'));
        try {
            link.parentNode.removeChild(link);
        } catch (e) {
            // do nothing
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73500519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档