chenhg5/cc-connect · error

media too large: %d chunks exceeds maximum %d

Error message

media too large: %d chunks exceeds maximum %d

What it means

uploadWSMedia enforces an upper bound on upload size: the data must fit within wecomWSUploadMaxChunks chunks of wecomWSUploadChunkSize bytes each. Oversized payloads would fail mid-upload after wasting time and bandwidth, so the limit is checked up front and this formatted error reports both the computed chunk count and the maximum allowed.

Source

Thrown at platform/wecom/websocket_outbound_media.go:50

	}

	mediaID, err := p.uploadWSMedia(ctx, "image", wsImageFileName(img), img.Data)
	if err != nil {
		return fmt.Errorf("wecom-ws: send image: %w", err)
	}
	if err := p.sendWSMediaMessage(ctx, rc.chatID, "image", mediaID); err != nil {
		return fmt.Errorf("wecom-ws: send image: %w", err)
	}
	return nil
}

func (p *WSPlatform) uploadWSMedia(ctx context.Context, mediaType, filename string, data []byte) (string, error) {
	totalChunks := (len(data) + wecomWSUploadChunkSize - 1) / wecomWSUploadChunkSize
	if totalChunks == 0 {
		return "", fmt.Errorf("empty media data")
	}
	if totalChunks > wecomWSUploadMaxChunks {
		return "", fmt.Errorf("media too large: %d chunks exceeds maximum %d", totalChunks, wecomWSUploadMaxChunks)
	}

	sum := md5.Sum(data)
	initReqID := p.generateReqID("aibot_upload_media_init")
	initFrame := map[string]any{
		"cmd":     "aibot_upload_media_init",
		"headers": map[string]string{"req_id": initReqID},
		"body": map[string]any{
			"type":         mediaType,
			"filename":     filename,
			"total_size":   len(data),
			"total_chunks": totalChunks,
			"md5":          hex.EncodeToString(sum[:]),
		},
	}
	initResp, err := p.writeAndWaitFrameWithTimeout(ctx, initFrame, initReqID, wsMediaAckTimeout)
	if err != nil {
		return "", fmt.Errorf("upload init: %w", err)

View on GitHub (pinned to 4000b2338a)

Solutions

  1. Check the file size before sending and reject/downscale anything above the limit with a user-friendly message.
  2. Compress or transcode the media (image re-encode, video bitrate reduction, archive compression) to fit within the limit.
  3. Split very large files into multiple smaller files, or host externally and send a link instead.
  4. If the constant is configurable in your build/config, raise wecomWSUploadMaxChunks — but confirm the WeCom server actually accepts larger uploads.

Example fix

// before
if err := p.SendFile(chatID, bigVideo, "recording.mp4"); err != nil { ... }

// after
const maxUpload = wecomWSUploadMaxChunks * wecomWSUploadChunkSize
if len(bigVideo) > maxUpload {
    return fmt.Errorf("file is %d bytes; max supported is %d — compress or send a link", len(bigVideo), maxUpload)
}
if err := p.SendFile(chatID, bigVideo, "recording.mp4"); err != nil { ... }
Defensive patterns

Strategy: validation

Validate before calling

func withinWSUploadLimit(data []byte) bool {
    return len(data) > 0 && len(data) <= wecomWSUploadMaxChunks*wecomWSUploadChunkSize
}

Try / catch

var tooLarge *MediaTooLargeError
if errors.As(err, &tooLarge) {
    // compress, split, or fall back to sending a download link
}

Prevention

When it happens

Trigger: SendImage or SendFile invoked with data whose size exceeds wecomWSUploadMaxChunks * wecomWSUploadChunkSize — e.g. a multi-hundred-MB video or log archive passed to SendFile over the WebSocket transport.

Common situations: Users forwarding large recorded videos or build artifacts through the bot; deployments where the WeCom WebSocket channel replaces the HTTP upload path that had different (larger) limits; version changes where the WS chunk limit was introduced and previously-working large files started failing.

Understand the failure class

Background: "File too large" / "file size exceeds limit" errors: why libraries cap file sizes and how to fix them — this error's family across 46 libraries.

Related errors


AI-assisted analysis of chenhg5/cc-connect@4000b2338a (2026-09-06). Data as JSON: /api/errors/29578b9ab236e607. Report an issue: GitHub.