deno-slack-api icon indicating copy to clipboard operation
deno-slack-api copied to clipboard

[QUERY] How to use files.upload to upload a binary file

Open spencerwilson opened this issue 1 year ago • 4 comments

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.

spencerwilson avatar Mar 05 '24 02:03 spencerwilson

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.

seratch avatar Mar 05 '24 02:03 seratch

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.upload in the Deno client worked fine when uploading a text file via content; 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.upload with, https://api.slack.com/methods/files.getUploadURLExternal. I was unaware of files.getUploadURLExternal and I appreciate the suggestion for an alternative!

spencerwilson avatar Mar 05 '24 17:03 spencerwilson

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?

ChuckJonas avatar Apr 03 '24 16:04 ChuckJonas

I honestly would've expected the sdk to contain a shorthand for the file upload that internally calls the two methods

simhnna avatar Dec 04 '24 15:12 simhnna