看你的路径能猜出你是打算上传本地文件,但是浏览器不支持这样的上传,你需要通过上面帖子中给过你的代码上传,或者如果是本地上传可以使用 HTML5 File 对象,浏览器是有权限限制,如果本地上传通过 input type=file 可以取到,另外通过 base64 也是个方式,或者 file 对象读取本地文件然后传二进制也可以。都有接口,请再参考文档。如果不了解,那就通过 input 上传吧,最简单。

是APICloud 移动应用,大师的意思只能两种办法base64和input,ajaj可以做到,APICloud的mcm也能直接上传img标签的图片,为什么这个就不行,能不能做一个适合移动应用的JS SDK呀,或者做APICloud的原生模块也行,最主要的就是LeanCloud云比APICloud云快,才选择的。

APICloud、appCan、DCloud、H5 plus 等等之类的技术,都是一种 Hybird 方案,原理是通过 Native 与 Web 通信,甚至是通过 bulid 将 Web 部分组件 Native 化来实现的 Native App 的一种技术。其实这才是他们的本质,而他们的服务端技术,我这里保留我的意见,暂不评论。

首先为什么用一个技术方案,你要综合调研,仔细了解一下。

上传图片输入 URL,这个 URL 也只是一个资源定位符,Hybird 方案中的图片应该是本地的或插件中特定文件路径内的图片,或者原理是先下载到本地,再通过 API 上传。这是 Native App 本身的能力,不是 Web 浏览器所具备的。

LeanCloud 与他们不同,我们重点在于提供后端接口和纯 Native SDK(JavaScript SDK、iOS SDK、Andriod SDK、C++ SDK、Windows Phone SDK 等等)。

所以,回到上传这个问题,LeanCloud 提供了上传接口,这个接口支持多种数据格式,你可以调研,并尝试通过对应的方式调用。如果是 iOS App 那可以通过下载图片,然后再从本地上传也可。但是纯 Web 抓取图片上传的功能我们暂时没有,而且这个功能提供了可能会有被图片商屏蔽、甚至起诉的风险。浏览器的限制我们也是突破不了的,比如浏览器读本地文件需要授权、特定文件等,可以参考 HTML5 File 相关标准文档。

再补一刀,使用 APICloud、appCan、DCloud、H5 plus 等等之类的技术,也可以同时使用 LeanCloud 的各种服务。

1 人赞了这个帖子.

JS SDK只提供2种上传方式,编码和inpu file。而这两都不适合。
原因;1.编码的话,不是URL我使用不了缩略图,(解决方法是,你们能不能在后端将编码转成URL再提交给七牛?)
2.inpu file 用于移动端的话,在选择图片时体验不好,我用原生的再返回本地的url或编码。因为html5的选择图片体验问题实现没有其它解决方式。
所以肯请官方出个编码转成URL的功能。
妈呀。几个月了就围着这个问题转,,一直找不到好方法。谢谢

我也是在移动端用input上传图片,但是一直提示无法解析url,请问你解决了吗?

使用ipnut,看2楼的例子

就是用的这个方法,在手机上的浏览器,一直出错,提示URL无法解析。

试试pc上正不正常。pc可以的话,手机浏览器一样的

pc上试了,一切正常,但是就是手机上的浏览器就不行,好像是手机安全的问题吧!

用input没有url,img 才有url,所以input和跨域没有关系。再试试其它浏览器或者去DCloud和APICloud找找更方便的方式吧

后来看,很多用户通过 Native 把图片读出来转成 base64,然后给 js,直接上传 base64 也可以试试看。

上传图片文件的这段代码是写在ejs文件下,我这样报错,提示AV未定义。
还是把这段代码放到app.js里面,这样的话,又会提示document未定义。
现在不知道leancloud给出的那段例程代码,到底放在哪里,怎么用,希望解答以下。

不是很理解你的问题。。。如果你想通过服务器上传,那在 nodejs 中加载 AV 模块,具体参考 LeanEngine 文档。如果是纯前端使用,请加载 SDK,然后使用。你的问题好像是没分清前后端,ejs 模板引擎是在服务端渲染,但是 template 部分是渲染之后在前端运行的。具体的你再研究研究 nodejs 和 ejs 吧。

看源码一目了然啊:
save: function() {
var options = null;
var saveOptions = {};
if(arguments.length === 1) {
options = arguments[0];
} else if(arguments.length === 2) {
saveOptions = arguments[0];
options = arguments[1];
}
var self = this;
if (!self._previousSave) {
if(self._source) {
var upload = require('./browserify-wrapper/upload');
upload(self, AV, saveOptions);
} else if(self.url && self.metaData['__source'] == 'external') {
//external link file.
var data = {
name: self._name,
ACL: self._acl,
metaData: self._metaData,
mime_type: self._guessedType,
url: self._url
};
self.previousSave = AV.request("files", self._name, null, 'POST', data).then(function(response) {
self._name = response.name;
self._url = response.url;
self.id = response.objectId;
if(response.size) {
self._metaData.size = response.size;
}
return self;
});
}
}
return self.previousSave.thenRunCallbacks(options);
}
};

};

您好,我按着您给出的代码,执行后的结果不知道为什么是{"error":"Document not found"},您能帮看一下吗?谢谢

你现在学会上传了吗?请教你一下怎么上传的呗

Document not found,你看下你的 js 的代码,应该没有获取到 input 中的 file 对象。

我用了base64,但是一直提示
Uncaught TypeError: Illegal constructor at https://cdn1.lncld.net/static/js/av-min-1.2.1.js:24

感觉完全是按照官方文档来的呀,并且打印出来base64编码也是没有问题的
var data = { base64: my_base64};
var file = new AV.File('HEAD.jpg',data)
file.save().then(function(file) {
// 文件保存成功
console.log(file.url());
}, function(error) {
// 异常处理
console.error(error);
});

请求解决