开发者社区
社区提问意见反馈
开发者钉组织
扫描二维码
加入支付宝开发者钉组织
基础 api
基础
应用级事件
界面
跳转
多媒体
缓存
文件
位置
网络
发起请求
上传
uploadtask
下载
websocket
设备
worker
数据安全
分享
收藏
自定义通用菜单
更新管理
web-view组件控制
升级支付宝最新版本
隐私信息授权
小程序广告
开放能力 api
开发 > api > 基础 api > 网络 > 上传 > my.uploadfile
评论 (5)
收藏
我的文档
设置

uploadtask my.uploadfile(object object)

主体: 企业支付宝小程序个人支付宝小程序

上传本地文件到开发者服务器。

客户端发起的是一个 https post 请求。

使用 my.requestmy.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)
此字段的值没有意义,老的支付宝版本会校验必填项。任意类型都可传入 'image',以兼容老版本

header object - -

http 请求 header。
- 其中 content-type 为 multipart/form-data(与 request body 实际格式一致),请勿更改。

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..

请参考上文接入准备中的配置流程。

  • 添加服务器域名白名单后,一定要发布新版上架,否则不会生效。
  • 需要配置的是入参 url 中的域名。
9 request:fail abort

调用了 uploadtask.abort() 中断了请求任务。

11 文件不存在

请检查本地文件是否存在。

参数非法

请检查是否有必传项没传、检查是否有字段传错类型。
注:老的支付宝版本会强制校验 filetype 字段(但不会实际使用),不传会报错“参数非法”。任意类型都可传入 'image',以兼容老版本。

缺少参数 ${name}

传入必填参数

参数 xxx 类型错误

检查参数类型

12 上传超时

若文件过大,可使用 timeout 设定超时时间。

请求失败

请检查网络环境是否正常,服务器是否稳定,外网下是否能正常请求。

系统异常

安卓端 filepath 不合法可能会报系统异常,请检查 filepath;
安卓端网络问题也可能会报系统异常,请检查网络环境是否正常。

未能找到使用指定主机名的服务器

请检查服务器地址是否拼写正确,确保服务器能够正常连接。

20 请求 url 不支持 http,请使用 https。

小程序已经不支持 http 请求,请使用 https。

代码示例
扫码体验
上传图片
上传视频
上传文件
服务端代码示例
上传图片
上传多张图片
上传 base64 图片
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));
            },
        });
    },
});
.java
.php
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 版本已修复。
  • bug
    10.3.90 以下安卓端 request body 中文件的 content-type 为空,服务端无法据此获取文件类型。10.3.90 及以上版本无此问题。如需兼容低版本,需要依据文件内容自行检测。
内容没有解决您的问题?您还可以前往 或 寻求帮助
凯发k8官方网娱乐官方 copyright © 2022 支付宝(杭州)信息技术有限公司  | icp证浙b2-20160559
该文档对你是否有帮助?
当前页面目录
网站地图