MCPcopy
hub / github.com/openimsdk/open-im-server / RunTask

Method RunTask

tools/url2im/pkg/manage.go:193–256  ·  view source on GitHub ↗
(ctx context.Context, task Task)

Source from the content-addressed store, hash-verified

191}
192
193func (m *Manage) RunTask(ctx context.Context, task Task) (string, error) {
194 resp, err := m.HttpGet(ctx, task.Upload.URL)
195 if err != nil {
196 return "", err
197 }
198 defer resp.Body.Close()
199 reader, err := NewReader(resp.Body, m.conf.CacheSize, m.tempFilePath())
200 if err != nil {
201 return "", err
202 }
203 defer reader.Close()
204 part, err := m.getPartInfo(ctx, reader, reader.Size())
205 if err != nil {
206 return "", err
207 }
208 var contentType string
209 if task.Upload.ContentType == "" {
210 contentType = part.ContentType
211 } else {
212 contentType = task.Upload.ContentType
213 }
214 initiateMultipartUploadResp, err := m.api.InitiateMultipartUpload(ctx, &third.InitiateMultipartUploadReq{
215 Hash: part.PartMd5,
216 Size: reader.Size(),
217 PartSize: part.PartSize,
218 MaxParts: -1,
219 Cause: "batch-import",
220 Name: task.Upload.Name,
221 ContentType: contentType,
222 })
223 if err != nil {
224 return "", err
225 }
226 if initiateMultipartUploadResp.Upload == nil {
227 return initiateMultipartUploadResp.Url, nil
228 }
229 if _, err := reader.Seek(0, io.SeekStart); err != nil {
230 return "", err
231 }
232 uploadParts := make([]*third.SignPart, part.PartNum)
233 for _, part := range initiateMultipartUploadResp.Upload.Sign.Parts {
234 uploadParts[part.PartNumber-1] = part
235 }
236 for i, currentPartSize := range part.PartSizes {
237 md5Reader := NewMd5Reader(io.LimitReader(reader, currentPartSize))
238 if err := m.doPut(ctx, m.api.Client, initiateMultipartUploadResp.Upload.Sign, uploadParts[i], md5Reader, currentPartSize); err != nil {
239 return "", err
240 }
241 if md5val := md5Reader.Md5(); md5val != part.PartMd5s[i] {
242 return "", fmt.Errorf("upload part %d failed, md5 not match, expect %s, got %s", i, part.PartMd5s[i], md5val)
243 }
244 }
245 urlRaw, err := m.api.CompleteMultipartUpload(ctx, &third.CompleteMultipartUploadReq{
246 UploadID: initiateMultipartUploadResp.Upload.UploadID,
247 Parts: part.PartMd5s,
248 Name: task.Upload.Name,
249 ContentType: contentType,
250 Cause: "batch-import",

Callers 1

RunMethod · 0.95

Calls 12

HttpGetMethod · 0.95
tempFilePathMethod · 0.95
getPartInfoMethod · 0.95
doPutMethod · 0.95
Md5Method · 0.95
NewReaderFunction · 0.85
NewMd5ReaderFunction · 0.85
CloseMethod · 0.65
SizeMethod · 0.65
SeekMethod · 0.45

Tested by

no test coverage detected