Javascript 允许tus ruby服务器将文件记录保存到数据库
到目前为止,我已经有了一个文件上传API,它使用Silence来处理文件附件,并且我已经在混合中添加了Javascript 允许tus ruby服务器将文件记录保存到数据库,javascript,ruby-on-rails,json,ruby,file-upload,Javascript,Ruby On Rails,Json,Ruby,File Upload,到目前为止,我已经有了一个文件上传API,它使用Silence来处理文件附件,并且我已经在混合中添加了tus ruby server,以添加恢复上传的功能 我已经按照这些步骤进行了修改,以便在从tusrubyserver的端点上传文件时,还可以使用sicle的文件处理创建数据库记录 当我将文件直接发布到API的uploads端点时,它会发送JSON数据,如下所示: {"video"=>#<ActionDispatch::Http::UploadedFile:0x007f811d1d5
tus ruby server
,以添加恢复上传的功能
我已经按照这些步骤进行了修改,以便在从tusrubyserver
的端点上传文件时,还可以使用sicle的文件处理创建数据库记录
当我将文件直接发布到API的uploads端点时,它会发送JSON数据,如下所示:
{"video"=>#<ActionDispatch::Http::UploadedFile:0x007f811d1d5920 @tempfile=#<Tempfile:/tmp/RackMultipart20170517-19364-6pfr0g.webm>, @original_filename="video.webm", @content_type="video/webm", @headers="Content-Disposition: form-data; name=\"video\"; filename=\"video.webm\"\r\nContent-Type: video/webm\r\n">, "id"=>"35"}
有没有迹象表明这里出了什么问题
下面是处理上传的JavaScript(使用
tus js client
):
我以前使用的JavaScript在不使用tus的情况下处理上传:
var formData = new FormData();
formData.append('video', blob, 'video.webm');
makeXMLHttpRequest('http://localhost:3000/api/uploads/' + gon.currentId, 'PUT', formData);
当您使用tus上传文件并使用JSON上传的文件表示向端点提交回调时,什么失败了?@janko-m它与发布数据的形式有关。当我通过API的端点直接上传时,文件数据被包装成某种散列格式(我相信ActiveRecord的散列文件上传),但当我使用
tus
上传时,它会将其作为纯JSON发送,当我尝试获取JSON并将其发送到API端点,以便通过tus
上传文件的数据库记录时,这会给我带来问题。在ActiveRecord的文件散列中是否有包装这个JSON的方法?我想你指的是多部分上传和直接上传。对于前者,您将文件上载到处理上载的同一个端点,对于后者,您将单独上载文件,然后仅将上载的文件数据提交到您的端点(Silke使用JSON格式)。这是最基本的区别,也是直接异步上传的全部优势,您希望以不同的方式处理这两种情况。Shire的attachment属性接受这些JSON字符串(除了常规文件),您可以将其与Shire::attachment
或Shire::Attacher
一起使用。对于此类问题,我建议使用Shire邮件列表,因为StackOverflow注释有点限制。
var upload = new tus.Upload(file, {
chunkSize: 1024 * 1024,
endpoint: 'http://localhost:3000/files',
metadata: {filename: file.name, content_type: file.type},
onError: function(error) {
alert(error);
},
onProgress: function(bytesSent, bytesTotal) {
var progress = parseInt(bytesSent / bytesTotal * 100, 10);
var percentage = progress.toString() + '%';
console.log(percentage + ' finished');
},
onSuccess: function(result) {
var fileData = {
id: upload.url,
storage: 'cache',
metadata: {
filename: upload.file.name.match(/[^\/\\]+$/)[0],
size: upload.file.size,
mime_type: upload.file.type
}
};
var fileDataJSON = JSON.stringify(fileData);
var formData = new FormData();
formData.append('video', fileDataJSON);
makeXMLHttpRequest('http://localhost:3000/api/uploads/' + gon.currentId, 'PUT', formData);
}
});
console.log('Uploading video recording to server...');
upload.start();
var formData = new FormData();
formData.append('video', blob, 'video.webm');
makeXMLHttpRequest('http://localhost:3000/api/uploads/' + gon.currentId, 'PUT', formData);