| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Mime\Part;
- use Symfony\Component\Mime\Exception\InvalidArgumentException;
- use Symfony\Component\Mime\Header\Headers;
- /**
- * @author Fabien Potencier <fabien@symfony.com>
- */
- class DataPart extends TextPart
- {
- private ?string $filename = null;
- private string $mediaType;
- private ?string $cid = null;
- /**
- * @param resource|string|File $body Use a File instance to defer loading the file until rendering
- */
- public function __construct($body, ?string $filename = null, ?string $contentType = null, ?string $encoding = null)
- {
- if ($body instanceof File && !$filename) {
- $filename = $body->getFilename();
- }
- $contentType ??= $body instanceof File ? $body->getContentType() : 'application/octet-stream';
- [$this->mediaType, $subtype] = explode('/', $contentType);
- parent::__construct($body, null, $subtype, $encoding);
- if (null !== $filename) {
- $this->filename = $filename;
- $this->setName($filename);
- }
- $this->setDisposition('attachment');
- }
- public static function fromPath(string $path, ?string $name = null, ?string $contentType = null): self
- {
- return new self(new File($path), $name, $contentType);
- }
- /**
- * @return $this
- */
- public function asInline(): static
- {
- return $this->setDisposition('inline');
- }
- /**
- * @return $this
- */
- public function setContentId(string $cid): static
- {
- if (!str_contains($cid, '@')) {
- throw new InvalidArgumentException(\sprintf('The "%s" CID is invalid as it doesn\'t contain an "@".', $cid));
- }
- $this->cid = $cid;
- return $this;
- }
- public function getContentId(): string
- {
- return $this->cid ?: $this->cid = $this->generateContentId();
- }
- public function hasContentId(): bool
- {
- return null !== $this->cid;
- }
- public function getMediaType(): string
- {
- return $this->mediaType;
- }
- public function getPreparedHeaders(): Headers
- {
- $headers = parent::getPreparedHeaders();
- if (null !== $this->cid) {
- $headers->setHeaderBody('Id', 'Content-ID', $this->cid);
- }
- if (null !== $this->filename) {
- $headers->setHeaderParameter('Content-Disposition', 'filename', $this->filename);
- }
- return $headers;
- }
- public function asDebugString(): string
- {
- $str = parent::asDebugString();
- if (null !== $this->filename) {
- $str .= ' filename: '.$this->filename;
- }
- return $str;
- }
- public function getFilename(): ?string
- {
- return $this->filename;
- }
- public function getContentType(): string
- {
- return implode('/', [$this->getMediaType(), $this->getMediaSubtype()]);
- }
- private function generateContentId(): string
- {
- return bin2hex(random_bytes(16)).'@symfony';
- }
- public function __serialize(): array
- {
- $parent = parent::__serialize();
- $headers = $parent['_headers'];
- unset($parent['_headers']);
- return [
- '_headers' => $headers,
- '_parent' => $parent,
- 'filename' => $this->filename,
- 'mediaType' => $this->mediaType,
- 'cid' => $this->cid,
- ];
- }
- public function __unserialize(array $data): void
- {
- parent::__unserialize(['_headers' => $data['_headers'] ?? $data["\0*\0_headers"], ...$data['_parent'] ?? $data["\0*\0_parent"]]);
- $this->filename = $data['filename'] ?? $data["\0".self::class."\0filename"] ?? null;
- $this->mediaType = $data['mediaType'] ?? $data["\0".self::class."\0mediaType"];
- $this->cid = $data['cid'] ?? $data["\0".self::class."\0cid"] ?? null;
- }
- }
|