[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>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
ffc08858cf
Коммит
446c763fa8
@@ -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
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user