我有一个应该从远程api下载文件的请求。但是,我想要的是保存此文件时使用与从浏览器下载文件时保存的文件相同的名称。例如,我有一个网址https://myapi.com/files/4hjiguo4ho45946794526975429
,当我点击此链接时,浏览器会立即开始从该网址下载名为myfile20180601.txt
的文件。如果我从Node.js发出请求,如何保存具有相同名称的文件?这是我的代码:
axios({
method: 'get',
url: 'https://myapi.com/files/4hjiguo4ho45946794526975429',
responseType: 'stream',
headers: {
Authorization: 'Basic KJVEB46287blablablatoken'
}
})
.then(res => res.data.pipe(fs.createWriteStream(`${/* filename */}.txt`)))
.catch(err => console.error(err));
答案 0 :(得分:1)
后端已经回答了,我在这里发布前端的答案。
可以通过访问事件获取浏览的文件名 --> event.target.files[0].name
例如:
val actionCodeSettings = ActionCodeSettings.newBuilder().apply {
url = "https://appname.no/email_verify/"
handleCodeInApp = true
iosBundleId = iosBundleId
setAndroidPackageName(
androidPackageName,
true, /* installIfNotAvailable */
"0" /* minimumVersion */
)
}.build()
btnSubmit.onClick {
pDialog?.show()
Firebase.auth.sendSignInLinkToEmail(etEmail.value ?: "", actionCodeSettings)
.addOnSuccessListener {
pDialog?.dismiss()
prefs.email = etEmail.value
Toast.makeText(this@LoginActivity, "Email sent to ${prefs.email}.", Toast.LENGTH_SHORT).show()
Timber.d("Email sent.")
}
.addOnCanceledListener {
Timber.d("Email cancelled.")
pDialog?.dismiss()
}
.addOnFailureListener {
Timber.d("Email sending failed: ${it.message}.")
pDialog?.dismiss()
it.printStackTrace()
}
}
答案 1 :(得分:0)
您可以在axios
的响应中找到您的文件名var axios = require('axios')
var fs = require('fs')
axios({
method:'get',
url:'https://myapi.com/files/4hjiguo4ho45946794526975429',
responseType:'stream'
})
.then(function(response) {
let headerLine = response.data.headers['content-disposition']
let startFileNameIndex = headerLine.indexOf('"') + 1
let endFileNameIndex = headerLine.lastIndexOf('"')
let filename = headerLine.substring(startFileNameIndex, endFileNameIndex)
response.data.pipe(fs.createWriteStream(filename))
});
希望这个回复能帮到你