为什么此curl命令返回意外的EOF

时间:2019-02-06 21:25:27

标签: bash shell curl telligent

我对Bash和cURL有点陌生,无法理解为什么这个Bash文件在不抛出Unexpected EOF错误的情况下无法运行。

此cURL命令应将20 MB的大文件(在下面的示例脚本中,介于300到400 MB之间)上载到存储服务。一旦所有MB上传完毕,第二条命令“完成”上传。这两个命令使用相同的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部分,并用CurrentChunk0替换了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 个答案:

答案 0 :(得分:1)

从传递给curl的参数来看,服务器需要分块数据。

但是curl命令会发送整个文件20次。

查看https://community.telligent.com/community/10/w/api-documentation/61481/upload-cfs-rest-endpoint上CurrentChunk的定义,也许可以进行如下修改:

#!/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[@]}