SaveFileToStorage saves any multipart file to an external storage system.
(fileheader *multipart.FileHeader, path string, storage Storage)
| 531 | |
| 532 | // SaveFileToStorage saves any multipart file to an external storage system. |
| 533 | func (c *DefaultCtx) SaveFileToStorage(fileheader *multipart.FileHeader, path string, storage Storage) error { |
| 534 | if fileheader == nil { |
| 535 | return ErrFileHeaderNil |
| 536 | } |
| 537 | |
| 538 | file, err := fileheader.Open() |
| 539 | if err != nil { |
| 540 | return fmt.Errorf("%w: %q: %w", ErrFileOpen, fileheader.Filename, err) |
| 541 | } |
| 542 | defer file.Close() //nolint:errcheck // not needed |
| 543 | |
| 544 | maxUploadSize := c.app.config.BodyLimit |
| 545 | if maxUploadSize <= 0 { |
| 546 | maxUploadSize = DefaultBodyLimit |
| 547 | } |
| 548 | |
| 549 | if fileheader.Size > 0 && fileheader.Size > int64(maxUploadSize) { |
| 550 | return fmt.Errorf("%w: %q: %w", ErrFileRead, fileheader.Filename, fasthttp.ErrBodyTooLarge) |
| 551 | } |
| 552 | |
| 553 | buf := bytebufferpool.Get() |
| 554 | defer bytebufferpool.Put(buf) |
| 555 | |
| 556 | limitedReader := io.LimitReader(file, int64(maxUploadSize)+1) |
| 557 | if _, err = buf.ReadFrom(limitedReader); err != nil { |
| 558 | return fmt.Errorf("%w: %q: %w", ErrFileRead, fileheader.Filename, err) |
| 559 | } |
| 560 | |
| 561 | if buf.Len() > maxUploadSize { |
| 562 | return fmt.Errorf("%w: %q: %w", ErrFileRead, fileheader.Filename, fasthttp.ErrBodyTooLarge) |
| 563 | } |
| 564 | |
| 565 | data := append([]byte(nil), buf.Bytes()...) |
| 566 | |
| 567 | if err := storage.SetWithContext(c.Context(), path, data, 0); err != nil { |
| 568 | return fmt.Errorf("%w: %q to %q: %w", ErrFileStore, fileheader.Filename, path, err) |
| 569 | } |
| 570 | |
| 571 | return nil |
| 572 | } |
| 573 | |
| 574 | // Secure returns whether a secure connection was established. |
| 575 | func (c *DefaultCtx) Secure() bool { |