[QUERY] How to use files.upload to upload a binary file
Question
How does one use files.upload? I tried
import { Readable } from "node:stream";
// ...
// This is a `ReadableStream<Uint8Array>`...
const audio = (await fetch("https://upload.wikimedia.org/wikipedia/commons/7/71/George_Gershwin_2.ogg")).body!;
const response = await client.files.upload({
channels: "<channel ID>",
title: "Title",
initial_comment: "Comment",
// ...which I adapt into a Node.js `Readable` here
file: Readable.from(audio),
filename: "audio.ogg",
filetype: "ogg",
});
With this code, the API response is {"ok":false,"error":"no_file_data"}. I was expecting this to work since the files.upload JavaScript sample code, whose docs do similar, refer to something like the above as the legacy way to upload files. My use case is simple so I think I'm ok with a legacy way, as long as it works. Thanks!
Context
Environment
"deno-slack-sdk/": "https://deno.land/x/[email protected]/",
"deno-slack-api/": "https://deno.land/x/[email protected]/",
deno 1.40.5 (release, aarch64-apple-darwin) v8 12.1.285.27 typescript 5.3.3
ProductName: macOS ProductVersion: 14.2.1 BuildVersion: 23C71 Darwin Kernel Version 23.2.0: Wed Nov 15 21:53:18 PST 2023; root:xnu-10002.61.3~2/RELEASE_ARM64_T6000
Requirements
Please read the Contributing guidelines and Code of Conduct before creating this issue or pull request. By submitting, you are agreeing to those rules.
Hi @spencerwilson, thanks for asking the question! Our team is working on the files.upload v2 method addition in this PR: https://github.com/slackapi/deno-slack-api/pull/90 but it seems the changes may need some time until its release.
As a short-term solution, checking my code example mentioned at https://github.com/slackapi/deno-slack-api/issues/89 may be helpful for you. The code uploads a text file but you should be able to upload audio file by adjusting some parts of it.
Thanks very much @seratch , I'll give that a try! Here's some misc other context that Slack folks might want to know:
- My use of the Deno client was in the context of a "next-gen app". I'm inexperienced with Deno, but very experienced with TypeScript and Node.js.
-
files.uploadin the Deno client worked fine when uploading atextfile viacontent; it's just this binary file upload I couldn't figure out how to get working - Consider updating https://api.slack.com/messaging/files and/or https://api.slack.com/methods/files.upload to mention, or compare/contrast
files.uploadwith, https://api.slack.com/methods/files.getUploadURLExternal. I was unaware offiles.getUploadURLExternaland I appreciate the suggestion for an alternative!
I'm here for the same reasons :(
The client (injected from the deno function) does not seem to have a method called slackApi.files.getUploadURLExternal.
@spencerwilson how did you end up implementing this? Did you just use the token to call the endpoint with fetch?
I honestly would've expected the sdk to contain a shorthand for the file upload that internally calls the two methods