Как транслировать музыку в моем приложении по ссылке Google Диска и сделать ссылку доступной?
На веб-сайте пользователи могут загружать музыку. Эта музыка загружается в мою учетную запись Google Drive. После этого в базу данных записывается следующий формат ссылки:
https://drive.google.com/uc?id=ID_GOES_HERE
Теперь, когда вы переходите по ссылке, она меняется примерно так:
https://doc-14-8s-docs.googleusercontent.com/docs/securesc/m4p0h6h3bpkoufgbajruvng9n4f51clu/fnjf7ftnl18svtcblses77hapi91jpe5/1597565925000/10139445714759083419/10139445714759083419/1mLu_myEgts9eaoWv6S9nxu8n4qfZM0Rr?authuser=0
Длинная ссылка - это ссылка в базе данных, которая используется приложением для воспроизведения музыки, но у меня больше нет разрешения открывать ее там. Как сделать последнюю и длинную ссылку доступной? Есть ли способ сделать эту длинную ссылку общедоступной?
Спасибо!
<form id="form">
<input name="file" id="uploadfile" type="file">
<input name="filename" id="filename" type="text">
<input id="submit" type="submit">
</form>
<script>
const form = document.getElementById('form');
form.addEventListener('submit', e => {
e.preventDefault();
const file = form.file.files[0];
const fr = new FileReader();
fr.readAsArrayBuffer(file);
fr.onload = f => {
const url = "https://script.google.com/macros/s/###/exec"; // <--- Please set the URL of Web Apps.
const qs = new URLSearchParams({filename: form.filename.value || file.name, mimeType: file.type});
fetch(`${url}?${qs}`, {method: "POST", body: JSON.stringify([...new Int8Array(f.target.result)])})
.then(res => res.json())
.then(e => console.log("https://drive.google.com/uc? export=download&id=" + e.fileId))
.catch(err => console.log(err));
}
});
</script>
Это скрипт приложения Google
function doPost(e) {
const folderId = "root"; // Folder ID which is used for putting the file, if you need.
const blob = Utilities.newBlob(JSON.parse(e.postData.contents), e.parameter.mimeType, e.parameter.filename);
const file = DriveApp.getFolderById(folderId || "root").createFile(blob);
const responseObj = {filename: file.getName(), fileId: file.getId(), fileUrl: file.getUrl()};
return ContentService.createTextOutput(JSON.stringify(responseObj )).setMimeType(ContentService.MimeType.JSON);
}
------- РЕДАКТИРОВАТЬ -------
Я попробовал данное решение:
к сожалению, это работает не так, как ожидалось. Я получаю следующую ссылку:
https://drive.google.com/uc?export=download&id=1Tnh8UgAzFKrp6e-8QCl21v16L3yVCqso
теперь, когда я беру из него идентификатор и вставляю его сюда:
http://docs.google.com/uc?export=open&id=your_file_id
В результате получилась действительно длинная ссылка, которая мне и нужна. Он все еще недоступен, если я, например, в режиме частного браузера, он заставляет меня входить в систему, чего я не хочу. Он должен быть доступен по ссылке, как в вашем решении. Это ссылка:
https://doc-08-8s-docs.googleusercontent.com/docs/securesc/m4p0h6h3bpkoufgbajruvng9n4f51clu/cgag5dus6c18p9hc1hv0362urudm2g6t/1597730475000/10139445714759083419/10139445714759083419/1Tnh8UgAzFKrp6e-8QCl21v16L3yVCqso?e=open&authuser=0
как сделать эту ссылку доступной?
Похоже, эта ссылка имеет установленные вами разрешения http://docs.google.com/uc?export=open&id=your_file_id но если вы скопируете длинную ссылку, она не предоставит настройки разрешений, она все равно заблокируется.
Ответы
После создания файла вам необходимо предоставить ему надлежащий уровень доступа, который определяет, кто может получить к нему доступ, а также уровень разрешений, который определяет, что они могут делать с этим файлом (чтение / запись / удаление).
В вашем случае он должен быть общедоступным по ссылке и только для чтения. Вот как вы можете сделать в сценарии приложения
const file = DriveApp.getFolderById(folderId || "root").createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW); // <-- add this