Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ファイルのダウンロードが上手くいかないor遅い #2174

Open
mehm8128 opened this issue Jan 2, 2024 · 9 comments
Open

ファイルのダウンロードが上手くいかないor遅い #2174

mehm8128 opened this issue Jan 2, 2024 · 9 comments
Labels
kind/bug バグや機能不全に関するもの

Comments

@mehm8128
Copy link
Member

mehm8128 commented Jan 2, 2024

ダウンロードボタンからダウンロードしようとするとtraq.s3.なんたら~のURLに飛ばされてしまい、ダウンロードができない
スマホからだとしばらくしてからダウンロードが走った記憶がある

@mehm8128 mehm8128 added the kind/bug バグや機能不全に関するもの label Jan 2, 2024
@logica0419
Copy link
Member

Conohaからwasabiに移行したせいてDLリンクがうまく動かなくなっている可能性を考えている

@Nagarei
Copy link
Contributor

Nagarei commented Jan 3, 2024

s3からのファイル配信の場合はs3にリダイレクトしてそうですが、302が返ってきたときってファイルのダウンロードはじめてくれるんでしょうか?

traQ/router/utils/common.go

Lines 102 to 105 in ee248c0

// 直接アクセスURLが発行できる場合は、そっちにリダイレクト
if url := meta.GetAlternativeURL(); len(url) > 0 {
return c.Redirect(http.StatusFound, url)
}

s3を使わない場合はダウンロードになるように工夫をしてそう。

traQ/router/utils/common.go

Lines 116 to 118 in ee248c0

if v, _ := strconv.ParseBool(c.QueryParam("dl")); v {
c.Response().Header().Set(echo.HeaderContentDisposition, fmt.Sprintf("attachment; filename*=UTF-8''%s", url.PathEscape(meta.GetFileName())))
}

@motoki317
Copy link
Member

「ダウンロードが上手くいかない」というのは、ブラウザがファイルとして保存してくれなくてインラインで表示してくれるということですかね?
つまりContent-Dispositionが上手く付いていない?
https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition

@Nagarei
Copy link
Contributor

Nagarei commented Jan 3, 2024

UI側のダウンロードリンクが、location.href になってるところを、aタグdownload属性に変えてやることでも対処できるかもしれない。(サーバーで工夫するのをやめて、クライアントで工夫する)

https://github.com/traPtitech/traQ_S-UI/blob/e5d3cfff4447bea092b758a8b9dbaaf03c00156e/src/composables/files/useFileLink.ts#L8-L10

と思って試してみたけど、クロスオリジンなのでうまくいかなさそう。

@Nagarei
Copy link
Contributor

Nagarei commented Jan 3, 2024

元々

  • traQがContent-Dispositionをつけて返している

今(s3を使用)

  • traQが302を返す(traq.s3.~にリダイレクト)
  • traq.s3がX-Amz-Meta-Content-Dispositionをつけて返してきている(Content-Dispositionはついていない)

@Nagarei
Copy link
Contributor

Nagarei commented Jan 3, 2024

s3使用時でもContent-Dispositionを付けようとはしていそう

traQ/utils/storage/s3.go

Lines 124 to 155 in ee248c0

// SaveByKey srcの内容をkeyで指定されたファイルに書き込みます
func (fs *S3FileStorage) SaveByKey(src io.Reader, key, name, contentType string, fileType model.FileType) (err error) {
if fs.cacheable(fileType) {
cacheName := fs.getCacheFilePath(key)
file, fe := os.Create(cacheName)
if fe == nil {
defer func() {
file.Close()
if err != nil {
_ = os.Remove(cacheName)
}
}()
src = io.TeeReader(src, file)
}
}
input := &s3.PutObjectInput{
Bucket: aws.String(fs.bucket),
Key: aws.String(key),
Body: src,
ContentType: aws.String(contentType),
Metadata: map[string]string{
"Content-Disposition": fmt.Sprintf("attachment; filename*=UTF-8''%s", url.PathEscape(name)),
},
}
uploader := manager.NewUploader(fs.client)
_, err = uploader.Upload(context.Background(), input)
return
}

@Nagarei
Copy link
Contributor

Nagarei commented Jan 3, 2024

Metadataではなくて、直接指定するのが正しいのでは?(手元の色々いじってる環境でですが動作確認しました)

	input := &s3.PutObjectInput{
		Bucket:             aws.String(fs.bucket),
		Key:                aws.String(key),
		Body:               src,
		ContentType:        aws.String(contentType),
		ContentDisposition: aws.String(fmt.Sprintf("attachment; filename*=UTF-8''%s", url.PathEscape(name))),
	}

@Nagarei
Copy link
Contributor

Nagarei commented Jan 13, 2024

既にアップロード済みのファイルは僕のPRとは別で対処する必要があると思いますがcloseして大丈夫ですか? @logica0419
古いファイルはどうせダウンロードされないし放置でも良いかもしれない

@logica0419
Copy link
Member

あ、そうかその対処が終わっていなかった…忘れていました
ありがとうございます、戻します

@logica0419 logica0419 reopened this Jan 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind/bug バグや機能不全に関するもの
Projects
None yet
Development

No branches or pull requests

4 participants