You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart如何发送大体积POST数据?解决base64图片截断问题

Dart HTTP Request: Fixing Truncated Base64 Data When Uploading Large Images

Hey there, let's tackle this frustrating issue you're having with truncated base64 data when uploading images via Dart's http package. I've seen this exact problem before, and it's almost always related to how the request body is encoded—not a built-in length limit in Dart.

Why Your Base64 Data Is Getting Truncated

When you use http.post(apiUrl, body: requestBody) with a Map<String, String>, the http package automatically encodes the request body using the application/x-www-form-urlencoded format. This format works great for small key-value pairs, but it's not designed for large text data like base64-encoded images:

  • Many servers and reverse proxies (like Nginx, Apache) have default size limits for x-www-form-urlencoded payloads, which can truncate your data silently.
  • The encoding process for this format can also introduce unintended character escaping or truncation for extremely long strings.

Your native Android code is likely using multipart/form-data instead—a format built specifically for transmitting large or binary data—hence why it works without issues.

Does Dart Have a Request Body Length Limit?

Short answer: No. Dart's http package doesn't impose any hardcoded length limits on request bodies. The problem is purely in the encoding strategy you're using.

How to Properly Send Large Data in Dart

The fix is to switch to using a MultipartRequest instead of a regular post with a form-encoded body. Here's how to modify your code:

startUpload(File file) async {
  var bytes = await file.readAsBytes();
  var base64Img = base64.encode(bytes);
  debugPrint(base64Img);

  var apiUrl = "MY_URL";
  
  // Create a multipart request
  var request = http.MultipartRequest('POST', Uri.parse(apiUrl));
  
  // Add your regular form fields
  request.fields['requestType'] = 'upload';
  request.fields['job_id'] = jobId.toString();
  
  // Add the base64-encoded image as a form field
  request.fields['picture'] = base64Img;
  
  // 🚀 Pro Tip: Skip base64 entirely for better performance
  // Instead of encoding to base64, upload the raw binary file directly
  // This cuts payload size by ~30% and simplifies server parsing
  // request.files.add(await http.MultipartFile.fromPath('picture', file.path));
  
  // Send the request
  var response = await request.send();
  
  // Handle the response (convert stream to readable string)
  var responseBody = await response.stream.bytesToString();
  debugPrint(responseBody);
}

Key Benefits of This Approach:

  • multipart/form-data transmits data in chunks, avoiding the truncation issues common with x-www-form-urlencoded.
  • Servers are optimized to handle multipart requests for large files/data, so you won't hit unexpected size limits.
  • The optional pro tip (uploading raw binary) reduces payload size and simplifies both client and server code.

Additional Checks

  • Make sure your backend is configured to accept multipart/form-data requests and has sufficient size limits set (e.g., adjusting client_max_body_size in Nginx, or maxRequestSize in your backend framework).
  • Verify that the backend is correctly parsing multipart fields—most modern frameworks handle this automatically, but it's worth double-checking if you still run into issues.

内容的提问来源于stack exchange,提问作者X09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:35:44