class DownloadResponseFactory
{
public function __construct(
- protected Request $request
+ protected Request $request,
) {
}
);
}
+ /**
+ * Create a response that downloads the given file via a stream.
+ * Has the option to delete the provided file once the stream is closed.
+ */
+ public function streamedFileDirectly(string $filePath, string $fileName, bool $deleteAfter = false): StreamedResponse
+ {
+ $fileSize = filesize($filePath);
+ $stream = fopen($filePath, 'r');
+
+ if ($deleteAfter) {
+ // Delete the given file if it still exists after the app terminates
+ $callback = function () use ($filePath) {
+ if (file_exists($filePath)) {
+ unlink($filePath);
+ }
+ };
+
+ // We watch both app terminate and php shutdown to cover both normal app termination
+ // as well as other potential scenarios (connection termination).
+ app()->terminating($callback);
+ register_shutdown_function($callback);
+ }
+
+ return $this->streamedDirectly($stream, $fileName, $fileSize);
+ }
+
+
/**
* Create a file download response that provides the file with a content-type
* correct for the file, in a way so the browser can show the content in browser,
public function streamedInline($stream, string $fileName, int $fileSize): StreamedResponse
{
$rangeStream = new RangeSupportedStream($stream, $fileSize, $this->request);
- $mime = $rangeStream->sniffMime();
+ $mime = $rangeStream->sniffMime(pathinfo($fileName, PATHINFO_EXTENSION));
$headers = array_merge($this->getHeaders($fileName, $fileSize, $mime), $rangeStream->getResponseHeaders());
return response()->stream(
);
}
+ /**
+ * Create a response that provides the given file via a stream with detected content-type.
+ * Has the option to delete the provided file once the stream is closed.
+ */
+ public function streamedFileInline(string $filePath, ?string $fileName = null): StreamedResponse
+ {
+ $fileSize = filesize($filePath);
+ $stream = fopen($filePath, 'r');
+
+ if ($fileName === null) {
+ $fileName = basename($filePath);
+ }
+
+ return $this->streamedInline($stream, $fileName, $fileSize);
+ }
+
/**
* Get the common headers to provide for a download response.
*/