[MM-57500] Streaming support for importing file attachments (#26629)

* Bulk import: stream file attachments uploads

* Add comment with context on buffer size

* Add file name to logs

* Use sha256 to do checksum

* Fix bad merge

* Fix import file

* Update test

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
Claudio Costa
2024-04-19 15:49:33 -06:00
коммит произвёл GitHub
родитель ffc08858cf
Коммит 446c763fa8
10 изменённых файлов: 542 добавлений и 74 удалений

Просмотреть файл

@@ -633,6 +633,12 @@ func UploadFileSetRaw() func(t *UploadFileTask) {
}
}
func UploadFileSetExtractContent(value bool) func(t *UploadFileTask) {
return func(t *UploadFileTask) {
t.ExtractContent = value
}
}
type UploadFileTask struct {
Logger mlog.LoggerIFace
@@ -659,6 +665,10 @@ type UploadFileTask struct {
// the file. Plugins are still invoked.
Raw bool
// Whether or not to extract file attachments content
// This is used by the bulk import process.
ExtractContent bool
//=============================================================
// Internal state
@@ -729,14 +739,15 @@ func (a *App) UploadFileX(c request.CTX, channelID, name string, input io.Reader
))
t := &UploadFileTask{
Logger: c.Logger(),
ChannelId: filepath.Base(channelID),
Name: filepath.Base(name),
Input: input,
maxFileSize: *a.Config().FileSettings.MaxFileSize,
maxImageRes: *a.Config().FileSettings.MaxImageResolution,
imgDecoder: a.ch.imgDecoder,
imgEncoder: a.ch.imgEncoder,
Logger: c.Logger(),
ChannelId: filepath.Base(channelID),
Name: filepath.Base(name),
Input: input,
maxFileSize: *a.Config().FileSettings.MaxFileSize,
maxImageRes: *a.Config().FileSettings.MaxImageResolution,
imgDecoder: a.ch.imgDecoder,
imgEncoder: a.ch.imgEncoder,
ExtractContent: true,
}
for _, o := range opts {
o(t)
@@ -803,7 +814,7 @@ func (a *App) UploadFileX(c request.CTX, channelID, name string, input io.Reader
}
}
if *a.Config().FileSettings.ExtractContent {
if *a.Config().FileSettings.ExtractContent && t.ExtractContent {
infoCopy := *t.fileinfo
a.Srv().GoBuffered(func() {
err := a.ExtractContentFromFileInfo(c, &infoCopy)
@@ -1264,15 +1275,6 @@ func (a *App) SetFileSearchableContent(rctx request.CTX, fileID string, data str
return nil
}
func (a *App) getFileInfoIgnoreCloudLimit(rctx request.CTX, fileID string) (*model.FileInfo, *model.AppError) {
fileInfo, appErr := a.Srv().getFileInfo(fileID)
if appErr == nil {
a.generateMiniPreview(rctx, fileInfo)
}
return fileInfo, appErr
}
func (a *App) GetFileInfos(rctx request.CTX, page, perPage int, opt *model.GetFileInfosOptions) ([]*model.FileInfo, *model.AppError) {
fileInfos, err := a.Srv().Store().FileInfo().GetWithOptions(page, perPage, opt)
if err != nil {
@@ -1317,20 +1319,6 @@ func (a *App) GetFile(rctx request.CTX, fileID string) ([]byte, *model.AppError)
return data, nil
}
func (a *App) getFileIgnoreCloudLimit(rctx request.CTX, fileID string) ([]byte, *model.AppError) {
info, err := a.getFileInfoIgnoreCloudLimit(rctx, fileID)
if err != nil {
return nil, err
}
data, err := a.ReadFile(info.Path)
if err != nil {
return nil, err
}
return data, nil
}
func (a *App) CopyFileInfos(rctx request.CTX, userID string, fileIDs []string) ([]string, *model.AppError) {
var newFileIds []string