/**
* 请求响应数据
*/
class MsgResponse {
int code; // 状态代码,0 表示没有错误
Object data; // 数据内容,一般为字符串
String errmsg; // 错误消息
MsgResponse([this.code = 0, this.data = null, this.errmsg = ""]);
} static Map _makeHttpHeaders(
[String contentType,
String accept,
String token,
String XRequestWith,
String XMethodOverride]) {
Map headers = new Map<String, String>();
int i = 0; if (!strIsEmpty(contentType)) {
i++;
headers["Content-Type"] = contentType;
} if (!strIsEmpty(accept)) {
i++;
headers["Accept"] = accept;
} if (!strIsEmpty(token)) {
i++;
headers["Authorization"] = "bearer " + token;
} if (!strIsEmpty(XRequestWith)) {
i++;
headers["X-Requested-With"] = XRequestWith;
} if (!strIsEmpty(XMethodOverride)) {
i++;
headers["X-HTTP-Method-Override"] = XMethodOverride;
} if (i == 0) return null;
// print(headers.toString());
return headers;
} /** HTTP POST 上传文件 */
static Future<MsgResponse> httpUploadFile(
final String url,
final File file, {
String accept = "*/*",
String token,
String field = "picture-upload",
String file_contentType, // 默认为null,自动获取
}) async {
try {
List<int> bytes = await file.readAsBytes();
return await httpUploadFileData(url, bytes,
accept: accept,
token: token,
field: field,
file_contentType: file_contentType,
filename: file.path);
} catch (e) {
return new MsgResponse(699, null, e.toString());
}
} /** HTTP POST 上传文件 */
static Future<MsgResponse> httpUploadFileData(
final String url,
final List<int> filedata, {
String accept = "*/*",
String token,
String field = "picture-upload",
String file_contentType, // 默认为null,自动获取
String filename,
}) async {
try {
List<int> bytes = filedata;
var boundary = _boundaryString();
String contentType = 'multipart/form-data; boundary=$boundary';
Map headers =
_makeHttpHeaders(contentType, accept, token); //, "XMLHttpRequest"); // 构造文件字段数据
String data =
'--$boundary\r\nContent-Disposition: form-data; name="$field"; ' +
'filename="${getFileFullName(filename)}"\r\nContent-Type: ' +
'${(file_contentType == null) ? getMediaType(getFileExt(filename).toLowerCase()): file_contentType}\r\n\r\n';
var controller = new StreamController<List<int>>(sync: true);
controller.add(data.codeUnits);
controller.add(bytes);
controller.add("\r\n--$boundary--\r\n".codeUnits); controller.close();
bytes = await new Http.ByteStream(controller.stream).toBytes();
//print("bytes: \r\n" + UTF8.decode(bytes, allowMalformed: true)); Http.Response response =
await Http.post(url, headers: headers, body: bytes);
if (response.statusCode == 200) {
return new MsgResponse(0, response.body);
} else
return new MsgResponse(response.statusCode, response.body);
} catch (e) {
return new MsgResponse(699, null, e.toString());
}
} /** 生成随机字符串 */
static String randomStr(
[int len = 8, List<int> chars = _BOUNDARY_CHARACTERS]) {
var list = new List<int>.generate(
len, (index) => chars[_random.nextInt(chars.length)],
growable: false);
return new String.fromCharCodes(list);
} static const List<int> _BOUNDARY_CHARACTERS = const <int>[
0x30,
0x31,
0x32,
0x33,
0x34,
0x35,
0x36,
0x37,
0x38,
0x39,
0x61,
0x62,
0x63,
0x64,
0x65,
0x66,
0x67,
0x68,
0x69,
0x6A,
0x6B,
0x6C,
0x6D,
0x6E,
0x6F,
0x70,
0x71,
0x72,
0x73,
0x74,
0x75,
0x76,
0x77,
0x78,
0x79,
0x7A,
0x41,
0x42,
0x43,
0x44,
0x45,
0x46,
0x47,
0x48,
0x49,
0x4A,
0x4B,
0x4C,
0x4D,
0x4E,
0x4F,
0x50,
0x51,
0x52,
0x53,
0x54,
0x55,
0x56,
0x57,
0x58,
0x59,
0x5A
];
static const int _BOUNDARY_LENGTH = 48;
static final Random _random = new Random();
static String _boundaryString() {
var prefix = "---DartFormBoundary";
var list = new List<int>.generate(
_BOUNDARY_LENGTH - prefix.length,
(index) =>
_BOUNDARY_CHARACTERS[_random.nextInt(_BOUNDARY_CHARACTERS.length)],
growable: false);
return "$prefix${new String.fromCharCodes(list)}";
} static MediaType getMediaType(final String fileExt) {
switch (fileExt) {
case ".jpg":
case ".jpeg":
case ".jpe":
return new MediaType("image", "jpeg");
case ".png":
return new MediaType("image", "png");
case ".bmp":
return new MediaType("image", "bmp");
case ".gif":
return new MediaType("image", "gif");
case ".json":
return new MediaType("application", "json");
case ".svg":
case ".svgz":
return new MediaType("image", "svg+xml");
case ".mp3":
return new MediaType("audio", "mpeg");
case ".mp4":
return new MediaType("video", "mp4");
case ".htm":
case ".html":
return new MediaType("text", "html");
case ".css":
return new MediaType("text", "css");
case ".csv":
return new MediaType("text", "csv");
case ".txt":
case ".text":
case ".conf":
case ".def":
case ".log":
case ".in":
return new MediaType("text", "plain");
}
return null;
}

[Dart] Flutter 上传文件的更多相关文章

  1. IE8/9 JQuery.Ajax 上传文件无效

    IE8/9 JQuery.Ajax 上传文件有两个限制: 使用 JQuery.Ajax 无法上传文件(因为无法使用 FormData,FormData 是 HTML5 的一个特性,IE8/9 不支持) ...

  2. 三种上传文件不刷新页面的方法讨论:iframe/FormData/FileReader

    发请求有两种方式,一种是用ajax,另一种是用form提交,默认的form提交如果不做处理的话,会使页面重定向.以一个简单的demo做说明: html如下所示,请求的路径action为"up ...

  3. asp.net mvc 上传文件

    转至:http://www.cnblogs.com/fonour/p/ajaxFileUpload.html 0.下载 http://files.cnblogs.com/files/fonour/aj ...

  4. app端上传文件至服务器后台,web端上传文件存储到服务器

    1.android前端发送服务器请求 在spring-mvc.xml 将过滤屏蔽(如果不屏蔽 ,文件流为空) <!-- <bean id="multipartResolver&q ...

  5. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  6. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  7. 前端之web上传文件的方式

    前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构造请求上传文件 1. web上传 ...

  8. Django session cookie 上传文件、详解

    session 在这里先说session 配置URL from django.conf.urls import patterns, include, url from django.contrib i ...

  9. 4 django系列之HTML通过form标签来同时提交表单内容与上传文件

    preface 我们知道提交表单有2种方式,一种直接通过submit页面刷新方法来提交,另一种通过ajax异步局部刷新的方法提交,上回我们说了通过ajax来提交文件到后台,现在说说通过submit来提 ...

随机推荐

  1. PDF软件推荐——Sumatra PDF - imsoft.cnblogs

    Sumatra PDF 优点:绿色,小巧,快速,支持格式丰富 缺点:不支持修改和添加标记 链接: http://pan.baidu.com/s/1eQ1s3Nc 密码: d8h6 主页:http:// ...

  2. 计算n^k的开头三位和末尾三位(fmod(double x,double y)函数的引入)

    C 库函数 double fmod(double x, double y) 返回 x 除以 y 的余数. 所以fmod(x,1)得到的就是小数部分的值(如fmod(3.35,1)==0.35) htt ...

  3. 字符串匹配--扩展KMP模板

    对于一个字符串 s 以及子串 t ,扩展KMP可以用来求 t 与 s 的每个子串的最长公共前缀 ext [ i ],当然,如果有某个 ext 值等于 t 串的长度 lent ,那么就说明从其对应的 i ...

  4. ClickHouse 简单试用

    ClickHouse 具有强劲的数据分析能力,同时支持标准sql 查询,内置了好多聚合参数 同时可以方便的使用表函数连接不同的数据源(url,jdbc,文件目录...) 测试使用docker安装 参考 ...

  5. Revit API 加载族并生成实例图元

    在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...

  6. VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    查找是否有两个cvtres.exe.一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe, 另一个是C:\Wi ...

  7. visual studio 2010 c++ fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或

    解决方案: 1,在项目 上 选择 “视图”- “属性页” 2,选择 “配置属性” - “清单工具” - “输入输出”,将 “嵌入清单”的值设置为 “否”

  8. AIX6.1 线程模型说明

    引文:线程模型(Threading Model)默认从进程域 (M:N 模型 ) 改为系统全局域 (1:1 模型 ) 在 AIX 5L 中,pthread 线程的默认模型是 m:n 方式,而从 AIX ...

  9. 【转】深入理解java异常处理机制

    深入理解java异常处理机制 ; int c; for (int i = 2; i >= -2; i--) { c = b / i; System.out.println("i=&qu ...

  10. Zabbix二次开发_02获取数据

    最近准备写一个zabbix二次页面的呈现.打算调用zabbix api接口来进行展示. 具体流程以及获取的数据. 1.  获得认证密钥    2.  获取zabbix所有的主机组    3.  获取单 ...