Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LiveComponent] Live Actions cannot handle file downloads #1516

Open
richardhj opened this issue Feb 18, 2024 · 10 comments · May be fixed by #2483
Open

[LiveComponent] Live Actions cannot handle file downloads #1516

richardhj opened this issue Feb 18, 2024 · 10 comments · May be fixed by #2483

Comments

@richardhj
Copy link
Contributor

richardhj commented Feb 18, 2024

As live actions are treated as regular controller actions, they should also support file responses.

#[LiveAction]
public function submit(): BinaryFileResponse
{
    $this->validate();

    return $this->file($this->exporter->generate($this->items));
}

Currently, file downloads are not downloaded but parsed..?

Screenshot 2024-02-18 at 13 28 23

Edit (current workaround)

public function submit(UriSigner $uriSigner): Response
{
    $this->validate();


    $file = $this->exporter->generate($this->items)

    $url = $this->generateUrl('admin_download', ['file' => base64_encode($file)]);

    return $this->redirect($uriSigner->sign($url));
}
@smnandre
Copy link
Member

Hello @richardhj

there is no support of File responses currently in LiveComponent

Couple of solutions:

  • send a redirect response -> GET url of your response (what i'd do)
  • use a standard action/URL instead of a live one (probably not the best there as it seems you need some form data)
  • create a custom action in your Stimulus controller to handle the binary stream (but you may need to duplicate some code)

--

Some quotes cherry-picked from the RFC9110, in favor of the POST -> redirection -> GET solution

If one or more resources has been created on the origin server as a result of successfully processing a POST request, the origin server SHOULD send a 201 (Created) response containing a Location header field that provides an identifier for the primary resource created (Section 10.2.2) and a representation that describes the status of the request while referring to the new resource(s).

If the result of processing a POST would be equivalent to a representation of an existing resource, an origin server MAY redirect the user agent to that resource by sending a 303 (See Other) response with the existing resource's identifier in the Location field. This has the benefits of providing the user agent a resource identifier and transferring the representation via a method more amenable to shared caching

--

Now what seems weird to me is how the response seems handled and displayed in your example/capture... that may need some improvement / bug fixes :)

@richardhj
Copy link
Contributor Author

Hi @smnandre, thats valuale information, I implemented a redirect to a "download controller" 👍 👍

However, that redirect must be uri-signed, so I can make sure that only "authorized" files can be downloaded.
Maybe there is a way, Live component may support content-disposition in the future? 😄

@norkunas
Copy link
Contributor

same need here, so maybe this should be considered to be in core 🤔

@barbieswimcrew
Copy link
Contributor

would be awesome if file response handling would work one day ❤️

@stefpe
Copy link

stefpe commented Jul 2, 2024

+1

2 similar comments
@x-vlad-x
Copy link

x-vlad-x commented Jul 2, 2024

+1

@sebbemunich
Copy link

+1

@richardhj
Copy link
Contributor Author

Hey guys, this is not how OSS work and you are spamming other people's mailboxes.

@smnandre
Copy link
Member

smnandre commented Jul 2, 2024

Hi @stefpe, @x-vlad-x, @sebbemunich,

I understand your desire to see this feature implemented. However, as @richardhj mentioned, this is an open-source project, so you can either:

  • Open a pull request (PR) to add the feature.
  • Ask your company to sponsor someone to develop it.
  • Make a polite request for someone else to consider working on it.

If you want to support @barbieswimcrew's suggestion, thumbing up the first message in the issue is the best way, as it allows us to sort by this.


I performed a brief test with this method, which could serve as an implementation idea. This is similar to how Livewire implements this feature.

Here are some considerations for the implementation:

  • Handle readable streams if possible.
  • Ensure files do not remain in memory or the DOM unnecessarily.
  • Prevent the creation of large blobs (e.g., 1TB) in the DOM.
  • Verify the origin of the files (only accept local streams/files, perhaps with a custom header).
  • Enforce that this occurs only after a user action (not on load or after an event).

However, implementing this will take some time, which I currently do not have, as we all work on this in our free time.

(and I still believe that redirecting to a file is a much cleaner solution 😄 )

@italodeveloper
Copy link

This option would really be very useful.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants