uploadtask my.uploadfile(object object)
主体: 企业支付宝小程序 、 个人支付宝小程序
相关文档: 网络 api 使用须知 、 本地文件
上传本地文件到开发者服务器。
客户端发起的是一个 https post 请求。
使用 my.request
、my.uploadfile
前,需要先配置 服务器域名白名单。
- 自研小程序: 登录 > 进入 小程序详情页面 > 开发 > 开发设置 > 服务器域名白名单
- 第三方应用: 登录 > 进入第三方应用详情页面 > 开发设置 > 服务器域名白名单
在小程序开发过程中,可在小程序开发者工具(ide)配置忽略域名合法性检查,如果选择忽略,则在开发者工具中不会校验域名合法性。
- 小程序开发者工具: 右上角 详情 > 域名信息 > 忽略 http 请求域名合法性检查
注意:
- 在开发者工具中配置的忽略域名合法性检查,仅对开发阶段生效,若小程序上线,请务必先在开放平台上配置 服务器域名白名单 。
- 在控制台中修改关于 服务器域名白名单 的配置后,只对之后构建和发布的小程序版本生效,已上线的版本使用的是修改前的域名配置。
object object
查看示例
属性 | 类型 | 默认值 | 必填 | 兼容性 | 描述 |
---|---|---|---|---|---|
url | string | - | 是 | - | 开发者服务器地址 |
filepath | string | - | 是 | 支付宝: 10.2.80 ide: 3.4.3 |
要上传的 本地文件 路径 |
name | string | - | 是 | - | 文件对应的 key,开发者在服务端可以通过这个 key 获取文件的二进制内容 |
filetype | string | - | 是 | - | 文件类型支持图片、视频、音频(image / video / audio) |
header | object | - | 否 | - | http 请求 header。 |
formdata | object | - | 否 | - | http 请求中的其他数据,每个 key 为字段名,value 为字符串 |
timeout | number | 60000 | 否 | 支付宝: 10.2.80 ide: 3.4.3 |
超时时间,单位 ms |
hideloading | boolean | false | 否 | ide: 3.4.3 |
是否隐藏 loading 动画 |
success | function | - | 否 | - | 调用成功的回调函数 |
fail | function | - | 否 | - | 调用失败的回调函数 |
complete | function | - | 否 | - | 调用结束的回调函数(调用成功、失败都会执行) |
success 回调函数
参数
object res
属性 | 类型 | 描述 |
---|---|---|
data | string | 开发者服务器返回的数据 |
statuscode | number | 开发者服务器返回的 http 状态码 |
header | object | 开发者服务器返回的 header |
fail 回调函数
参数
object err
属性 | 类型 | 描述 |
---|---|---|
error | number | 错误码 |
errormessage | string | 错误信息 |
uploadtask
支付宝客户端 10.1.35 及以上版本,低版本需做 兼容处理。
可用于获取 http 响应头,监听上传进度变化,以及取消上传任务的对象。
fail 回调的参数为 object,error
属性为错误码,errormessage
属性为错误消息。
错误码 | 错误消息 | 凯发app官方网站的解决方案 |
---|---|---|
4 | 未配置域名白名单,无权访问域名。查看如何配置:https://xxx.. |
请参考上文接入准备中的配置流程。
|
9 | request:fail abort |
调用了 uploadtask.abort() 中断了请求任务。 |
11 | 文件不存在 | 请检查本地文件是否存在。 |
参数非法 | 请检查是否有必传项没传、检查是否有字段传错类型。 |
|
缺少参数 ${name} | 传入必填参数 |
|
参数 xxx 类型错误 | 检查参数类型 |
|
12 | 上传超时 | 若文件过大,可使用 timeout 设定超时时间。 |
请求失败 | 请检查网络环境是否正常,服务器是否稳定,外网下是否能正常请求。 |
|
系统异常 | 安卓端 filepath 不合法可能会报系统异常,请检查 filepath; |
|
未能找到使用指定主机名的服务器 | 请检查服务器地址是否拼写正确,确保服务器能够正常连接。 |
|
20 | 请求 url 不支持 http,请使用 https。 |
小程序已经不支持 http 请求,请使用 https。 |
my.chooseimage({
success: res => {
const path = res.apfilepaths[0];
console.log(path);
my.uploadfile({
url: 'https://httpbin.org/post', // 开发者服务器地址,此 url 仅为示例
name: 'userfile',
filepath: path,
formdata: { extra: '其他信息' },
success: res => {
my.alert({ title: '上传成功' });
},
fail: error => {
console.error('上传失败: ', json.stringify(error));
},
});
},
});
// my.uploadfile 一次只能上传一张图片,但是可以循环/并发调用
my.chooseimage({
count: 3, // 最多选择 3 张图片
success: (res) => {
for (let path of res.apfilepaths) { // 循环调用 my.uploadfile
my.uploadfile({
url: 'https://...', // 请替换成有效的服务端 url
name: 'userfile',
filepath: path,
success: () => {
console.log(`${path} upload success`);
},
fail: () => {
console.error(`上传 ${path} 失败: `, json.stringify(error));
}
});
}
}
});
// 1.可以使用 filesystemmanager.readfile 先读取文件内容,然后调用 my.arraybuffertobase64
// 2.再使用 my.request 将数据传给后端
my.chooseimage({
success: res => {
const fs = my.getfilesystemmanager();
fs.readfile({
filepath: `${res.apfilepaths[0]}`,
// readfile 不传入 encodding 参数,则以 arraybuffer 方式读取
success:({ data }) => {
const base64 = my.arraybuffertobase64(data);
// 转为 base64 后使用 my.request 将数据传给后端
my.request({
url: "https://...", // 上传地址
method: "post",
data: {
base64img: base64
},
success: function (res) {
},
fail: function (res) {
}
});
},
});
}
});
my.choosevideo({
success: res => {
const path = res.tempfilepath;
console.log(path);
my.uploadfile({
url: 'https://httpbin.org/post', // 开发者服务器地址,此 url 仅为示例
name: 'userfile',
filepath: path,
formdata: { extra: '其他信息' },
success: res => {
my.alert({ title: '上传成功' });
},
fail: err => {
my.alert({ title: '上传失败', content: json.stringify(err) });
},
});
},
});
// 小程序暂时没有从本地选择文件的 api,但上传接口是不限制文件类型的。
my.downloadfile({
url: 'https://alidata-pub.oss-cn-hangzhou.aliyuncs.com/test.pdf',
success: (res) => {
const path = res.apfilepaths[0];
console.log(path);
my.uploadfile({
url: 'https://httpbin.org/post', // 开发者服务器地址,此 url 仅为示例
name: 'userfile',
filepath: path,
formdata: { extra: '其他信息' },
success: res => {
my.alert({ title: '上传成功' });
},
fail: error => {
console.error('上传失败: ', json.stringify(error));
},
});
},
});
import java.io.ioexception;
import java.io.printwriter;
import java.util.scanner;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.part;
import javax.servlet.annotation.multipartconfig;
@multipartconfig(
filesizethreshold = 1024 * 1024 * 1,
maxfilesize = 1024 * 1024 * 10,
maxrequestsize = 1024 * 1024 * 100
)
public class uploadservlet extends httpservlet {
@override
public void dopost(httpservletrequest request, httpservletresponse response)
throws ioexception, servletexception
{
part filepart = request.getpart("userfile");
string filesize = filepart == null ? "0" : filepart.getsize() " bytes";
if (filepart != null) {
string filename = filepart.getsubmittedfilename();
string filepath = "/tmp/upload" filename.substring(filename.lastindexof(".")); // 文件命名,请自行修改
filepart.write(filepath);
}
part extrapart = request.getpart("extra");
string extravalue = extrapart == null ? "" : new scanner(extrapart.getinputstream(), "utf-8").usedelimiter("\\a").next();
response.setcharacterencoding("utf-8");
response.getwriter().print("file: " filesize "; extra: " extravalue);
}
}
function accept_my_upload() {
$size = 0;
$path = '';
if ($file = @$_files['userfile']) {
$name = $file['name'];
$ext = strrpos($name, '.') === false ? '' : substr($name, strrpos($name, '.'));
$path = '/tmp/' . time() . round(microtime() * 1000) . $ext; // 文件命名,请自行修改
if (move_uploaded_file($file['tmp_name'], $path)) {
$size = $file['size'];
}
}
$extra = @$_post['extra'];
echo "file: $size bytes($path); extra: $extra";
}
accept_my_upload();
-
tip只要成功接收到服务器返回,无论 statuscode 是多少,my.uploadfile 都会进入 success 回调。可通过
data
字段查看服务端的返回信息。请开发者根据业务逻辑对返回值进行判断。 -
tip若需要以 base64 编码上传图片,可将读取图片数据并编码后通过 my.request 发送给服务端,参考代码示例 【上传图片->上传 base64 图片】 。
-
tip该接口不限制上传类型。您可以上传任意(包括.php、.excel)格式的文件。但老的支付宝版本会强制校验入参 filetype,任意类型都可传入 'image' 以兼容老版本。
-
bug若 ios 端请求成功,安卓端请求失败,可能是安卓端 10.3.90 以下 url 不支持重定向导致的。此缺陷 10.3.90 版本已修复。
-
bug10.3.90 以下安卓端 request body 中文件的 content-type 为空,服务端无法据此获取文件类型。10.3.90 及以上版本无此问题。如需兼容低版本,需要依据文件内容自行检测。