Dropbox直接从浏览器上传文件
我试图直接上传文件到Dropbox [从浏览器/ Web应用程序],代码API上的“uploadFile”功能需要文件上传到服务器上,这让我陷入困境,因为我不想要任何文件上传到我的服务器,并从那里到Dropbox。
$f = fopen("test.jpg", "rb"); // requires file on server
$result = $dbxClient->uploadFile("test.jpg", dbxWriteMode::add(), $f);
fclose($f);
尝试了这个https://github.com/dropbox/dropbox-js失望地说,没有明确的文档,文档部分的许多链接被破坏。
我需要将文件上传到我的帐户,并且客户端不需要登录到Dropbox。
任何指针将非常感激。 寻找Ajax / JavaScript方法。
更新
我尝试了以下方法,但没有回复Dropbox
HTML
<input type="file" name="file" id="file" onchange="doUpload(event)">
JavaScript的
var doUpload = function(event){
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var arrayBuffer = reader.result;
$.ajax({
url: "https://api-content.dropbox.com/1/files_put/auto/uploads/" + input.files[0].name,
headers: {
Authorization: 'Bearer ' + MyAccessToken,
contentLength: file.size
},
crossDomain: true,
crossOrigin: true,
type: 'PUT',
contentType: input.files[0].type,
data: arrayBuffer,
dataType: 'json',
processData: false,
success : function(result) {
$('#uploadResults').html(result);
}
});
}
reader.readAsArrayBuffer(input.files[0]);
}
Dropbox刚刚发布了一篇博客,介绍如何做到这一点。 你可以在https://blogs.dropbox.com/developers/2016/03/how-formio-uses-dropbox-as-a-file-backend-for-javascript-apps/找到它(完全公开,我写了博客文章)。
以下是如何上传文件。
/**
* Two variables should already be set.
* dropboxToken = OAuth token received then signing in with OAuth.
* file = file object selected in the file widget.
*/
var xhr = new XMLHttpRequest();
xhr.upload.onprogress = function(evt) {
var percentComplete = parseInt(100.0 * evt.loaded / evt.total);
// Upload in progress. Do something here with the percent complete.
};
xhr.onload = function() {
if (xhr.status === 200) {
var fileInfo = JSON.parse(xhr.response);
// Upload succeeded. Do something here with the file info.
}
else {
var errorMessage = xhr.response || 'Unable to upload file';
// Upload failed. Do something here with the error.
}
};
xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload');
xhr.setRequestHeader('Authorization', 'Bearer ' + dropboxToken);
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
path: '/' + file.name,
mode: 'add',
autorename: true,
mute: false
}));
xhr.send(file);
然后从Dropbox下载文件做到这一点。
var downloadFile = function(evt, file) {
evt.preventDefault();
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.onload = function() {
if (xhr.status === 200) {
var blob = new Blob([xhr.response], {type: ’application/octet-stream’});
FileSaver.saveAs(blob, file.name, true);
}
else {
var errorMessage = xhr.response || 'Unable to download file';
// Upload failed. Do something here with the error.
}
};
xhr.open('POST', 'https://content.dropboxapi.com/2/files/download');
xhr.setRequestHeader('Authorization', 'Bearer ' + dropboxToken);
xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
path: file.path_lower
}));
xhr.send();
}
FileSaver和Blob无法在旧版浏览器上运行,因此您可以向他们添加解决方法。
正如其他答案所指出的,每个上传或下载文件的会话都需要访问Dropbox令牌。 向用户发送其他人的令牌是一个安全问题,因为拥有该令牌会让他们完全控制保管箱帐户。 做这项工作的唯一方法是让每个人使用Dropbox进行身份验证并获得他们自己的令牌。
在Form.io,我们已经实现了认证和上传/下载到我们的平台。 这使得构建带有Dropbox作为文件后端的Web应用程序非常简单。
“我需要将文件上传到我的帐户,并且客户端不需要登录到Dropbox。”
那么你真的需要做上传服务器端。 要做到这一点客户端意味着将访问令牌发送到浏览器,此时,您的应用的任何用户都可以使用该访问令牌来执行他们想要的任何操作。 (例如删除所有其他文件,上传他们的私人DVD收藏等)
出于安全原因,我强烈建议您在上传服务器端保留访问令牌的密码。
非常感谢@smarx和他的指针,我能够达到最终的解决方案。
此外,我还添加了一些额外功能,例如倾听上传进度,以便用户可以显示上传进度百分比。
HTML
<input type="file" name="file" id="file" onchange="doUpload(event)">
JavaScript的
var doUpload = function(event){
var input = event.target;
var reader = new FileReader();
reader.onload = function(){
var arrayBuffer = reader.result;
var arrayBufferView = new Uint8Array( arrayBuffer );
var blob = new Blob( [ arrayBufferView ], { type: input.files[0].type } );
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL( blob );
$.ajax({
url: "https://api-content.dropbox.com/1/files_put/auto/YourDirectory/" + input.files[0].name,
headers: {
'Authorization':'Bearer ' +YourToken,
'Content-Length':input.files[0].size
},
crossDomain: true,
crossOrigin: true,
type: 'PUT',
contentType: input.files[0].type,
data: arrayBuffer,
dataType: 'json',
processData: false,
xhr: function()
{
var xhr = new window.XMLHttpRequest();
//Upload progress, litsens to the upload progress
//and get the upload status
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = parseInt( parseFloat(evt.loaded / evt.total) * 100);
//Do something with upload progress
$('#uploadProgress').html(percentComplete);
$('#uploadProgressBar').css('width',percentComplete+'%');
}
}, false);
},
beforeSend: function(){
// Things you do before sending the file
// like showing the loader GIF
},
success : function(result) {
// Display the results from dropbox after upload
// Other stuff on complete
},
});
}
reader.readAsArrayBuffer(input.files[0]);
}
U使用了PUT方法,因为我们唯一的目标是上传文件,根据我对各种资源的研究(StackOverflow和zacharyvoase),put方法可以传输大文件,也可以将文件放在指定的URI上,如果文件存在文件必须被替换。 PUT方法不能移动到除指定URL之外的其他URL。
风险
您在客户端使用访问令牌存在风险,需要采取高安全措施来屏蔽令牌。 但现代的Web开发工具,如浏览器控制台,Firebug等可以监视您的服务器请求,并可以看到您的访问令牌。
链接地址: http://www.djcxy.com/p/41031.html上一篇: Dropbox direct upload files from browser
下一篇: Rails Put vs Post