我的应用程序基于Ember.js (2.13)
构建。我有User
模型,此时我正在处理头像上传功能。当我修改模型并保存它时,Ember会在PATCH
期间向我的API发出Ember
请求json-api
序列化程序构建漂亮的PUT
对象,我喜欢它。
当我需要将图像上传到服务器时,我需要向我的API发出一些jQuery
请求文件数据,我可以使用S3
ajax。服务器将调整大小并裁剪图像并将其保存在磁盘上或将其推送到User
存储桶。但我不喜欢这种方式,因为这个请求将绕过Ember的序列化程序创建,而不会引用模型。所以我需要将上传的文件名设置为base64
模型并保存,然后我会向服务器发出冗余请求。
我有想法在Ember.js应用中将文件转换为User
字符串,并将此字符串设置为Ember.js
模型并保存。在这种情况下,我会向服务器发出一个请求。这是上传文件的好方法吗?
请建议在super()
应用程序中上传文件的最佳做法。
答案 0 :(得分:1)
但我不喜欢这种方式,因为会创建此请求 绕过Ember的串行器而不参考模型。
你无能为力 - 余烬数据不支持文件。在许多情况下,ED还不够好(例如 - 嵌套资源URI,部分更新)。我建议不要太烦恼 - 如果你不能使用ember数据执行某些请求,只需使用Ember.$.ajax
。
不,你不是。只需将后端配置为返回完整的用户模型(与使用ED的其他获取/发布/更新请求一样),并将结果(如果请求成功,当然)传递给所以我需要将上传的文件名设置为用户模型,然后将其保存到我之后 对服务器有冗余请求。
store
this.get('session').authorize('authorizer:token', (headerName, headerValue) => {
const headers = {};
headers[headerName] = headerValue;
/*Instead of data object, you will create a formData*/
const data = {
/*Some data*/
};
Ember.$.ajax(
{
url: '/path-to-resource/id-of-resource',
headers,
type: "PUT",
data
}
)
.then(
(payload) => {
this.store.pushPayload(payload);
},
(response) => {
this.set('errorMessage', stringifyError(response));
}
)
.always(() => {
this.set('isLoading', false);
});
});
方法}}。商店将使用实际数据进行更新,无需额外请求。示例:
isa
UPD:有一个插件,pushPayload声称可以添加对文件上传的支持来嵌入数据。我自己没有尝试过,所以不能说它是否有效以及有多好。
答案 1 :(得分:1)
你可以尝试使用流行的余烬插件。
ember-plupload和ember-uploader插件