[*] Поместите необработанные байты файла в возвращаемый upload_url с использованием приложения/octet-stream и включить правильное содержание . files.completeUploadexternal , передавая возвращенный файл_ид и канал_ид.
Получить постоянную ссылку через файлы. />
Идентификатор файла создается правильно на шаге 1. < /li>
Сообщение появляется в канале Slack с ожидаемой постоянной ссылкой. Проблема: < /strong>
загруженный файл поврежден или нечитаем, и при попытке загрузить его с постоянной ссылки, Slack возвращает: < /p>
«Ошибка, обслуживающая ошибку» < /p>
< /blockquote>
В некоторых прогонках я также получаю этот временной ошибку: < /p> < /p> < /p> . />
Ошибка скручивания 28: Операция по временам после 60001 миллисекунд с 0
Bytes полученными < /p>
< /blockquote>
и добавление повторной задачи. /> Неверный тип ресурса: ресурс (закрыт)
Я знаю об этой связанной проблеме, которая предполагает прерывистые неудачи на стороне Слэка, но в моем случае это происходит очень последовательно, и в любом случае, что у другого поста еще нет ответа. />
Использование fopen ($ filePath, 'r') и fopen ($ filePath, 'rb') в качестве потока вместо файла_г_г. /> Явно добавление заголовка длины содержимого. /> < /ul>
Каков правильный и надежный способ поместить файл в Slack upload_url из PHP в 2025? Правильно?public static function sendFile(string $token, string $channel, string $filePath, string $filename, ?string $message = null)
{
$client = ClientFactory::create($token);
// Step 1: Get URL
$getUpload = $client->filesGetUploadURLExternal([
'filename' => $filename,
'length' => filesize($filePath),
'alt_txt' => $message ?? 'PDF file',
]);
$uploadUrl = $getUpload->getUploadUrl();
$fileId = $getUpload->getFileId();
// Step 2: Upload the file
$stream = fopen($filePath, 'r');
$putRes = Http::withOptions(['verify' => false])
//->retry(3, 5000) // 3 tries, 5 seconds each
->withHeaders([
'Content-Type' => 'application/octet-stream',
'Content-Length' => filesize($filePath),
])
->withBody($stream, 'application/octet-stream')
->timeout(60)
->put($uploadUrl);
// Step 3: Complete the upload
$client->filesCompleteUploadExternal([
'files' => [
[
'id' => $fileId,
'title' => $filename,
]
],
'channel_id' => $channel,
]);
// Step 4: Send the message with the file link
$fileInfo = $client->filesInfo(['file' => $fileId]);
$permalink = $fileInfo->getFile()->getPermalink();
$client->chatPostMessage([
'channel' => $channel,
'text' => "{$message}\n{$permalink}",
]);
}
< /code>
Любое понимание ценится. < /p>
Обновление: что -то с PHP. Этот сценарий Python работает: < /p>
# upload_slack_hardcoded.py
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
# ===
token = "xoxb-..."
channel_id = "C..."
file_path = "demo.pdf"
message = "
# ===
client = WebClient(token=token)
try:
with open(file_path, "rb") as file_content:
response = client.files_upload_v2(
channel=channel_id,
file=file_content,
filename="demo.pdf",
initial_comment=message
)
print("
except SlackApiError as e:
print("
except FileNotFoundError:
print("
except Exception as e:
print("
Подробнее здесь: https://stackoverflow.com/questions/796 ... recation-a
Мобильная версия