按钮放在哪里

如 Antd Pro 示例中,放在过滤设置区域还挺合适的。因为导出 Excel 需要遵循过滤条件,如时间段,类型等。

https://procomponents.ant.design/components/table#%E8%A1%A8%E5%8D%95%E6%93%8D%E4%BD%9C%E8%87%AA%E5%AE%9A%E4%B9%89

button or link

link 容易实现吧,target 设置一下,在新 tab 页中下载。

可以确认一下,Ant Design 有没有体验更好的组件。之前用过 Ant Design 的上传组件不错。

Ant Design 中 Button 有下载的图标,而且支持 href 属性。

https://ant.design/components/button-cn/#components-button-demo-icon

如何获取当前过滤参数

将 form Props 的属性 key 打印出来,猜测哪个是当前参数:

search={{
  labelWidth: 120,
  optionRender: (searchConfig, formProps, dom) => [
	...dom.reverse(),
	<Button icon={<DownloadOutlined />}
	  href={"/api/exportOxygenTimeExcel?id=" + formProps.DeviceId} >
	  导出 Excel { JSON.stringify(Object.keys(formProps.form)) }
	  导出 Excel { JSON.stringify(formProps.form.getFieldsValue()) }
	</Button>
  ],
}}

js post 的方式下载文件

但是用这种 url 的方式下载,有两个缺陷

  • url get 链接会被国产浏览器收集,并私下发起请求
  • 无法设置访问权限,如果用的是 jwt token 这种验证机制

所以还是用 post 请求更合理一些,参考:

https://www.pianshen.com/article/4210572427/

https://segmentfault.com/a/1190000021118085

下载函数的封装

https://www.delftstack.com/howto/javascript/javascript-download/

function download(blobData: Blob, forDownLoadFileName: string | null): any {
	const aLink = document.createElement('a');
	document.body.appendChild(aLink);
	aLink.style.display = 'none';
	aLink.href = window.URL.createObjectURL(blobData);
	aLink.setAttribute('download', forDownLoadFileName);
	aLink.click();
	document.body.removeChild(aLink);
}

umi request 下载文件的参数设置

https://www.cnblogs.com/wattmelon/p/14281599.html

import request from 'umi-request';

function download() {
	request('http://localhost:2000/download', {
	method: 'GET',
	responseType: 'blob',
}).then(res => {
	console.log(res)
	const blob = new Blob([res]);
	const objectURL = URL.createObjectURL(blob);
	let btn = document.createElement('a');
	btn.download = '文件名.pdf';
	btn.href = objectURL;
	btn.click();
	URL.revokeObjectURL(objectURL);
	btn = null;
});

golang gin 返回 excel blob

excelize "github.com/xuri/excelize/v2"

https://github.com/qax-os/excelize

gin 返回 Blob 的方式:

https://github.com/gin-gonic/gin/blob/1c2aa59b20c8cff5b3c601708afe22100eac25e6/context.go#L976

// Data writes some data into the body stream and updates the HTTP code.
func (c *Context) Data(code int, contentType string, data []byte) {
	c.Render(code, render.Data{
		ContentType: contentType,
		Data:        data,
	})
}

// DataFromReader writes the specified reader into the body stream and updates the HTTP code.
func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) {
	c.Render(code, render.Reader{
		Headers:       extraHeaders,
		ContentType:   contentType,
		ContentLength: contentLength,
		Reader:        reader,
	})
}

tags: Ant Design Pro