mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-21 10:27:46 +08:00
feat(gateway): ?filename with download=true
This implements 'attachment' mode triggered then ?filename parameter is accompanied with &download=true When Content-Disposition: attachment is detected by a modern browser it will skip rendering and immediately open the "save as" dialog, making this useful feature for using IPFS gateway as target of "Download" links on various websites. Parameter name was suggested in: https://github.com/ipfs/go-ipfs/pull/4177#issuecomment-414870327
This commit is contained in:
parent
48b2f1273a
commit
fd01acdfc0
@ -261,7 +261,11 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request
|
||||
urlFilename := r.URL.Query().Get("filename")
|
||||
var name string
|
||||
if urlFilename != "" {
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename*=UTF-8''%s", url.PathEscape(urlFilename)))
|
||||
disposition := "inline"
|
||||
if r.URL.Query().Get("download") == "true" {
|
||||
disposition = "attachment"
|
||||
}
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf("%s; filename*=UTF-8''%s", disposition, url.PathEscape(urlFilename)))
|
||||
name = urlFilename
|
||||
} else {
|
||||
name = getFilename(urlPath)
|
||||
|
||||
@ -49,6 +49,16 @@ your query string to explicitly specify the filename. For example:
|
||||
|
||||
> https://ipfs.io/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG?filename=hello_world.txt
|
||||
|
||||
When you try to save above page, you browser will use passed `filename` instead of a CID.
|
||||
|
||||
## Downloads
|
||||
|
||||
It is possible to skip browser rendering of supported filetypes (plain text,
|
||||
images, audio, video, PDF) and trigger immediate "save as" dialog by appending
|
||||
`&download=true`:
|
||||
|
||||
> https://ipfs.io/ipfs/QmfM2r8seH2GiRaC4esTjeraXEachRt8ZsSeGaWTPLyMoG?filename=hello_world.txt&download=true
|
||||
|
||||
## MIME-Types
|
||||
|
||||
TODO
|
||||
|
||||
@ -31,11 +31,16 @@ test_expect_success "GET IPFS path succeeds" '
|
||||
curl -sfo actual "http://127.0.0.1:$port/ipfs/$HASH"
|
||||
'
|
||||
|
||||
test_expect_success "GET IPFS path with explicit filename succeeds with proper header" "
|
||||
test_expect_success "GET IPFS path with explicit ?filename succeeds with proper header" "
|
||||
curl -fo actual -D actual_headers 'http://127.0.0.1:$port/ipfs/$HASH?filename=testтест' &&
|
||||
grep -F \"Content-Disposition: inline; filename*=UTF-8''test%D1%82%D0%B5%D1%81%D1%82\" actual_headers
|
||||
"
|
||||
|
||||
test_expect_success "GET IPFS path with explicit ?filename and download=true succeeds with proper header" "
|
||||
curl -fo actual -D actual_headers 'http://127.0.0.1:$port/ipfs/$HASH?filename=testтест&download=true' &&
|
||||
grep -F \"Content-Disposition: attachment; filename*=UTF-8''test%D1%82%D0%B5%D1%81%D1%82\" actual_headers
|
||||
"
|
||||
|
||||
# https://github.com/ipfs/go-ipfs/issues/4025#issuecomment-342250616
|
||||
test_expect_success "GET for Service Worker registration outside of an IPFS content root errors" "
|
||||
curl -H 'Service-Worker: script' -svX GET 'http://127.0.0.1:$port/ipfs/$HASH?filename=sw.js' > curl_sw_out 2>&1 &&
|
||||
|
||||
Loading…
Reference in New Issue
Block a user