使用 Cloudflare Workers 和 OneDrive API 实现文件上传功能
在现代网络应用中,文件上传是一个常见的需求。在本文中,我们将介绍如何使用 Cloudflare Workers 和 OneDrive API 实现一个简单而强大的文件上传功能。我们将创建一个基于 HTML 和 JavaScript 的用户界面,允许用户选择文件并将其上传到 OneDrive 存储中。
本文作者:Chat-gpt
代码概览
首先,让我们来看一下实现文件上传功能的关键代码。这段代码使用 Cloudflare Workers 提供的 addEventListener
函数来监听请求事件,然后调用 handleRequest
函数处理请求。
// 以下为前文代码,省略部分与 OneDrive API 无关的代码
// 处理 POST 请求
else if (request.method === 'POST') {
try {
// 解析上传的文件
const formData = await request.formData();
const file = formData.get('file');
// 获取 OneDrive 访问令牌
const accessToken = await getAccessToken();
// 构建 OneDrive API 请求
const apiUrl = `https://graph.microsoft.com/v1.0/users/eddie@412zml.onmicrosoft.com/drive/root:/Public/picture/blog/${file.name}:/content`;
const headers = {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/octet-stream',
};
const options = {
method: 'PUT',
headers: headers,
body: file,
};
// 发送文件到 OneDrive
const response = await fetch(apiUrl, options);
if (response.ok) {
// 返回成功响应
const jsonResponse = await response.json();
return new Response(JSON.stringify({ success: true, response: jsonResponse }), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
} else {
// 处理上传失败情况
console.error('File upload failed:', response.statusText);
console.error('OneDrive API Error:', await response.json());
return new Response(JSON.stringify({ success: false, error: response.statusText }), {
status: response.status,
headers: { 'Content-Type': 'application/json' },
});
}
} catch (error) {
// 处理上传过程中的错误
console.error('Error uploading file:', error);
return new Response(JSON.stringify({ success: false, error: error.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
}
// 以下为前文代码,省略部分与 OneDrive API 无关的代码
上述代码展示了如何使用 OneDrive API 将文件上传到 OneDrive 存储。首先,我们获取用户上传的文件,然后通过 OneDrive API 的 PUT
请求将文件上传到指定位置。上传成功后,返回相应的 JSON 数据。
OneDrive API 访问令牌获取
在上述代码中,我们通过 getAccessToken
函数获取 OneDrive API 的访问令牌。以下是获取访问令牌的实现逻辑。
async function getAccessToken() {
// 在这里实现获取 Azure AD 访问令牌的逻辑,使用你的应用程序凭据等信息
// 返回获取到的访问令牌
const clientId = 'YOUR_CLIENT_ID'; // 替换为你的应用程序的客户端 ID
const clientSecret = 'YOUR_CLIENT_SECRET'; // 替换为你的应用程序的客户端密钥
const tenantId = 'YOUR_TENANT_ID'; // 替换为你的 Azure AD 租户 ID
const tokenUrl = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;
const requestBody = new URLSearchParams({
grant_type: 'client_credentials',
client_id: clientId,
client_secret: clientSecret,
scope: 'https://graph.microsoft.com/.default', // 这个 scope 取决于你的应用程序和所需的权限
});
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: requestBody,
};
try {
const response = await fetch(tokenUrl, options);
const tokenData = await response.json();
if (response.ok) {
const accessToken = tokenData.access_token;
return accessToken;
} else {
throw new Error(`Failed to get access token: ${tokenData.error_description}`);
}
} catch (error) {
throw new Error(`Error getting access token: ${error.message}`);
}
}
在该函数中,我们使用应用程序的客户端 ID、客户端密钥和租户 ID 构建访问令牌请求,然后通过 fetch
函数发送请求获取访问令牌。获取到的访问令牌将用于构建 OneDrive API 请求的授权头部。
前端界面
用户界面是与用户交互的关键部分。在上面的代码中,我们通过 HTML 和 JavaScript 创建了一个简单的上传界面。用户可以选择文件,然后点击上传按钮。
<!DOCTYPE html>
<html>
<head>
<!-- 省略部分头部信息和样式 -->
</head>
<body>
<h1>鲨鱼上传</h1>
<label for="fileInput" class="custom-file-upload">FILE HERE</label>
<input type="file" id="fileInput" style="display:none;" />
<button onclick="uploadFile()">Upload</button>
<!-- 省略部分界面元素 -->
<script>
// 省略部分 JavaScript 代码
</script>
</body>
</html>
在界面中,我们使用了一个简单的表单,包含文件选择框、上传按钮以及一些用于显示上传结果的元素。
文件上传逻辑
文件上传逻辑主要由 JavaScript 代码实现。当用户点击上传按钮时,uploadFile
函数被调用,该函数负责获取用户选择的文件,构建 OneDrive API 请求,并发送文件到 OneDrive 存储。
async function uploadFile() {
// 省略部分代码
const formData = new FormData();
formData.append('file', fileInput.files[0]);
try {
const response = await fetch('/', {
method: 'POST',
body: formData
});
if (response.ok) {
//
处理成功上传的情况
const data = await response.json();
const resultUrl = document.getElementById('webUrl');
const resultName = document.getElementById('fileNamePlaceholder');
resultUrl.href = data.response.webUrl;
resultUrl.textContent = data.response.webUrl;
resultName.textContent = data.response.name;
// 移除弹跳动画类
h1Element.classList.remove('bounce-animation');
} else {
// 处理上传失败的情况
console.error('File upload failed:', response.statusText);
}
} catch (error) {
// 处理上传过程中的错误
console.error('Error uploading file:', error);
}
}
在这个函数中,我们首先创建一个 FormData
对象,将用户选择的文件附加到该对象中。然后,使用 fetch
函数发送 POST 请求,将文件上传到 Cloudflare Workers。在 Cloudflare Workers 中,我们再次使用 fetch
函数将文件传递给 OneDrive API。最终,将上传结果显示在界面上。
结语
通过结合 Cloudflare Workers 和 OneDrive API,我们实现了一个简单而有效的文件上传功能。这种方案具有低延迟、高可用性和强大的性能,为用户提供了良好的体验。在实际应用中,你可以根据需要进行扩展,添加更多功能和安全性措施,以满足特定的业务需求。希望本文能够帮助你理解如何使用 Cloudflare Workers 构建强大的文件上传服务。