router-for-me/CLIProxyAPI · warning

failed to open uploaded file: %w

Error message

failed to open uploaded file: %w

What it means

After confirming a file part exists, storeUploadedAuthFile calls file.Open() to get a reader for the uploaded multipart file. If Open() fails it returns `failed to open uploaded file: %w`. In Go's mime/multipart this is rare: it fails when the underlying temp file or memory buffer backing the part became unavailable (e.g. temp dir cleaned mid-request, part data corrupted) — not for user-format problems, which are caught earlier by the .json suffix check.

Source

Thrown at internal/api/handlers/management/auth_files_crud.go:247

	headers := make([]*multipart.FileHeader, 0)
	for _, key := range keys {
		headers = append(headers, form.File[key]...)
	}
	return headers, nil
}

func (h *Handler) storeUploadedAuthFile(ctx context.Context, file *multipart.FileHeader) (string, error) {
	if file == nil {
		return "", fmt.Errorf("no file uploaded")
	}
	name := filepath.Base(strings.TrimSpace(file.Filename))
	if !strings.HasSuffix(strings.ToLower(name), ".json") {
		return "", errAuthFileMustBeJSON
	}
	src, err := file.Open()
	if err != nil {
		return "", fmt.Errorf("failed to open uploaded file: %w", err)
	}
	defer src.Close()

	data, err := io.ReadAll(src)
	if err != nil {
		return "", fmt.Errorf("failed to read uploaded file: %w", err)
	}
	if err := h.writeAuthFile(ctx, name, data); err != nil {
		return "", err
	}
	return name, nil
}

func (h *Handler) writeAuthFile(ctx context.Context, name string, data []byte) error {
	dst := filepath.Join(h.cfg.AuthDir, filepath.Base(name))
	if !filepath.IsAbs(dst) {
		if abs, errAbs := filepath.Abs(dst); errAbs == nil {
			dst = abs

View on GitHub (pinned to 78f0c4079e)

Solutions

  1. Retry the upload — transient temp-file loss usually clears immediately.
  2. Reduce the upload size (auth files are small KB JSON; a huge file suggests the wrong file is attached).
  3. Check TMPDIR free space and fd limits (ulimit -n) on the server if failures repeat.
  4. Inspect the wrapped error for the OS cause before changing anything else.
Defensive patterns

Strategy: retry

Type guard

func isUploadOpenFailure(err error) bool {
    return err != nil && strings.Contains(err.Error(), "failed to open uploaded file")
}

Try / catch

if isUploadOpenFailure(err) {
    time.Sleep(time.Second)
    err = uploadAgain(file) // temp-file loss is transient
}

Prevention

When it happens

Trigger: Multipart part exceeding memory buffering and its temp file removed (TMPDIR cleaned or tmpfs reaped while the request was in flight); very large uploads hitting server temp constraints; OS-level file descriptor exhaustion preventing the temp file reopen.

Common situations: Oversized auth file uploads on containers with tiny /tmp; concurrent heavy uploads exhausting FDs; hosting platforms aggressively purging temp files.

Related errors


AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15). Data as JSON: /api/errors/6bf0b92bb7c144e2. Report an issue: GitHub.