Почему эта команда curl возвращает неожиданный EOF

Я немного новичок в Bash и cURL и не могу понять, почему этот файл Bash не запускается без Unexpected EOF ошибка.

Эта команда cURL должна выгрузить в службу хранения большой файл (в приведенном ниже примере сценария, где-то между 300 и 400 МБ) в виде фрагментов по 20 МБ. Как только все МБ загружены, вторая команда "завершает" загрузку. Обе команды используют один и тот же GUID.

внутри upload-bits.sh:

#!/bin/sh
for i in {0..20}; do
curl -X POST \
  https://community.<company>.com/api.ashx/v2/cfs/temporary.json \
  -H 'Rest-User-Token: 12345' \
  -F UploadContextId=21f23109-aac2-44ef-8b89-c0f62e67da4d \
  -F FileName='file.zip' \
  -F TotalChunks=20 \
  -F CurrentChunk=$i \
  -F 'file=@file.zip'
done

Сценарий Bash выдает Unexpected EOF ошибка. Я пробовал одну только команду cURL без части скрипта Bash и заменил CurrentChunk с 0 а также 1 безуспешно. Я также использовал валидатор скрипта, который подтвердил, что в скрипте нет проблем. Я тоже побежал dos2unix на это в стремлении устранить проблемы конца строки.

Я еще не смог использовать этот второй сценарий, так как первый сценарий не работал, но я публикую его для контекста, если я не объясняю желаемый общий процесс в целом.

complete-upload.sh:

curl -X POST \
  https://community.<company>.com/api.ashx/v2/media/371/files.json \
  -H 'Rest-User-Token: 12345' \
  -F 'Name=file.zip' \
  -F ContentType=application/zip \
  -F FileName='file.zip' \
  -F FileUploadContext=21f23109-aac2-44ef-8b89-c0f62e67da4d

Буду благодарен за любые советы или идеи. Спасибо.

1 ответ

Решение

Судя по параметрам, передаваемым в curl, сервер ожидает фрагментированные данные.

Однако команда curl отправляет весь файл 20 раз.

Если посмотреть на определение CurrentChunk по адресу https://community.telligent.com/community/10/w/api-documentation/61481/upload-cfs-rest-endpoint, возможно, подойдет такая модификация:

#!/bin/bash

# using GNU split options will make arithmetic simpler
# with -d, we may get numbers like 09 which are invalid octal
# start from 101 if CurrentChunk is one-based
# start from 100 if CurrentChunk is zero-based
split -b20M -a3 --numeric-suffixes=101 file.zip part.

partlist=( part.* )
numparts=${#partlist[@]}

for part in ${partlist[@]}; do
  i=$(( ${part##*.}-100 ))
  curl -X POST \
    https://community.<company>.com/api.ashx/v2/cfs/temporary.json \
    -H 'Rest-User-Token: 12345' \
    -F UploadContextId=21f23109-aac2-44ef-8b89-c0f62e67da4d \
    -F FileName='file.zip' \
    -F TotalChunks=$numparts \
    -F CurrentChunk=$i \
    -F 'file=@'$part
done

rm ${partlist[@]}
Другие вопросы по тегам