Flutter中ftpconnect上传图片后分辨率异常/失真问题求助
解决Flutter ftpconnect上传图片失真问题
问题分析
代码能成功上传文件但图片出现分辨率降低或失真,核心原因大概率是FTP传输模式错误(默认ASCII模式会破坏二进制图片文件结构),或是上传的并非原始图片文件。
解决步骤
1. 强制设置FTP二进制传输模式
FTP默认使用ASCII模式传输文本内容,图片属于二进制文件,必须切换到二进制模式才能保证文件完整性。在connect()之后添加二进制模式设置:
try { File fileToUpload = File(filePathPharmacy); await ftpConnect.connect(); // 关键操作:切换至二进制传输模式 await ftpConnect.setBinaryType(); await ftpConnect.changeDirectory( "/public_html/XXXXXX/XXXXXX/main/assets/userImags"); bool res = await ftpConnect.uploadFileWithRetry(fileToUpload, pRetryCount: 3); await ftpConnect.disconnect(); print(res); } catch (w) { print("error : $w"); }
注:若setBinaryType()方法不存在,可查看ftpconnect库对应版本的文档,使用等价的二进制设置方法,比如部分版本为ftpConnect.setType(FtpType.binary)
2. 确认上传的是原始图片文件
检查filePathPharmacy指向的文件是否为未压缩的原始图片:
- 直接打开本地路径对应的图片,确认分辨率和画质本身无问题
- 若图片来自相机拍摄,需确保获取的是原图路径而非系统自动生成的缩略图(部分相机API会默认返回压缩后的临时文件路径)
3. 验证文件传输完整性
上传后对比本地文件与服务器文件的MD5哈希值,确认文件是否完整传输:
- 计算本地文件MD5的示例代码:
import 'dart:convert'; import 'dart:io'; import 'package:crypto/crypto.dart'; Future<String> calculateMD5(File file) async { final stream = file.openRead(); final hash = await md5.bind(stream).first; return hex.encode(hash.bytes); }
- 下载服务器上的目标文件,计算相同的MD5值并对比。若不一致,说明传输过程存在丢包,可尝试增加重试次数或检查网络稳定性。
内容的提问来源于stack exchange,提问作者Adeeb Mark
相关产品推荐
相关产品推荐

