gpt4 book ai didi

reactjs - 如何使用 React 保存从服务器下载的文件?

转载 作者:行者123 更新时间:2023-12-03 13:10:14 25 4
gpt4 key购买 nike

我有一个后端 API,每当我们调用它时,它基本上都会下载一个模板。我在我的 html 页面上提供了一个 href,因此每当有人单击该 href 时,它都会调用后端 API 并且应该下载该文件。

但是文件没有被下载。

我正在使用 React。如果我只是从浏览器点击后端,文件就会被下载,但如果我从 react 中调用它,则不会。

有线索吗?

react 代码:

const config = require('config');
var aws4 = require('aws4');
const Promise = require('axios');

const requestHelper = {
appendHeaders(request){
request.headers = request.headers || {};
if(request.headers["Content-Type"]){
return
}
request.headers["Content-Type"] = "application/json";
},
externalApi(request, serverResult){
if(!request.method){
request.method='POST';
}
request.path = request.url
this.appendHeaders(request)
console.log('request',request)
return Promise(request)
.then((apiResponse) => {
if (apiResponse.data.errors) {
var error = apiResponse.data.errors;
console.log('api error response: ', error);
serverResult.status(400).json({ error })
} else {
console.log('api response: ', apiResponse.data);
serverResult.status(200).json(apiResponse.data);
}
}).catch((error) => {
console.log('api error response: ', error);
serverResult.status(400).json({ error });
});
},

getDownloadResponse(request, serverResult){
debugger;
request.path = request.url
this.appendHeaders(request)
console.log(request);
return Promise(request)
.then((apiResponse) => {
if (apiResponse.data.errors) {
var error = apiResponse.data.errors;
console.log('api error response: ', error);
serverResult.status(400).json({ error })
} else {
serverResult.status(200);
console.log('api response status: '+200);
}
}).catch((error) => {
console.log('api error response: ', error);
serverResult.status(400).json({ error });
});
}
};

module.exports = requestHelper;

后端 API 代码:

@RequestMapping(value = GlobalConstants.DOWNLOAD_FILE, method = RequestMethod.GET)
public void downloadTemplate(HttpServletRequest hRequest, HttpServletResponse response) throws Exception {

InputStream in = null;
OutputStream out = null;
try {
if (!StringUtils.isEmpty(sampleFile)) {
File file = new File(sampleFile);
in = finderService.downloadFile(sampleFile);
if (in != null) {
MimetypesFileTypeMap mimetypesFileTypeMap = new MimetypesFileTypeMap();
response.setContentType(mimetypesFileTypeMap.getContentType(file));
String headerKey = "Content-Disposition";
String headerValue = String.format("attachment; filename=\"%s\"", file.getName());
response.setHeader(headerKey, headerValue);

out = response.getOutputStream();
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
}
} else {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
logger.error("Internal Server error"); //Add logs for server error here also

} catch (Throwable th) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
logger.error(th);
return;
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.flush();
}
}
}

最佳答案

JS 中的 GET 请求与在浏览器中访问 url 不同。您需要通过指定 URL 直接在客户端调用下载,例如:

download() {
// fake server request, getting the file url as response
setTimeout(() => {
const response = {
file: 'http://releases.ubuntu.com/12.04.5/ubuntu-12.04.5-alternate-amd64.iso',
};
// server sent the url to the file!
// now, let's download:
window.open(response.file);
// you could also do:
// window.location.href = response.file;
}, 100);
}

这里是a working example on JSBin .

注意,如果您想下载浏览器可以显示的文件(例如 JSON、图像、视频),它们将显示在新选项卡中。如果您希望直接下载这些类型的文件,则需要使用一些解决方法,例如使用 blob。有a few examples of this就在这里。

关于reactjs - 如何使用 React 保存从服务器下载的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40707684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com