You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

api-list.go 2.9 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package minio_ext
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. )
  9. // ListObjectParts list all object parts recursively.
  10. func (c Client) ListObjectParts(bucketName, objectName, uploadID string) (partsInfo map[int]ObjectPart, err error) {
  11. // Part number marker for the next batch of request.
  12. var nextPartNumberMarker int
  13. partsInfo = make(map[int]ObjectPart)
  14. for {
  15. // Get list of uploaded parts a maximum of 1000 per request.
  16. listObjPartsResult, err := c.listObjectPartsQuery(bucketName, objectName, uploadID, nextPartNumberMarker, 1000)
  17. if err != nil {
  18. return nil, err
  19. }
  20. // Append to parts info.
  21. for _, part := range listObjPartsResult.ObjectParts {
  22. // Trim off the odd double quotes from ETag in the beginning and end.
  23. part.ETag = strings.TrimPrefix(part.ETag, "\"")
  24. part.ETag = strings.TrimSuffix(part.ETag, "\"")
  25. partsInfo[part.PartNumber] = part
  26. }
  27. // Keep part number marker, for the next iteration.
  28. nextPartNumberMarker = listObjPartsResult.NextPartNumberMarker
  29. // Listing ends result is not truncated, return right here.
  30. if !listObjPartsResult.IsTruncated {
  31. break
  32. }
  33. }
  34. // Return all the parts.
  35. return partsInfo, nil
  36. }
  37. // listObjectPartsQuery (List Parts query)
  38. // - lists some or all (up to 1000) parts that have been uploaded
  39. // for a specific multipart upload
  40. //
  41. // You can use the request parameters as selection criteria to return
  42. // a subset of the uploads in a bucket, request parameters :-
  43. // ---------
  44. // ?part-number-marker - Specifies the part after which listing should
  45. // begin.
  46. // ?max-parts - Maximum parts to be listed per request.
  47. func (c Client) listObjectPartsQuery(bucketName, objectName, uploadID string, partNumberMarker, maxParts int) (ListObjectPartsResult, error) {
  48. // Get resources properly escaped and lined up before using them in http request.
  49. urlValues := make(url.Values)
  50. // Set part number marker.
  51. urlValues.Set("part-number-marker", fmt.Sprintf("%d", partNumberMarker))
  52. // Set upload id.
  53. urlValues.Set("uploadId", uploadID)
  54. // maxParts should be 1000 or less.
  55. if maxParts == 0 || maxParts > 1000 {
  56. maxParts = 1000
  57. }
  58. // Set max parts.
  59. urlValues.Set("max-parts", fmt.Sprintf("%d", maxParts))
  60. // Execute GET on objectName to get list of parts.
  61. resp, err := c.executeMethod(context.Background(), "GET", requestMetadata{
  62. bucketName: bucketName,
  63. objectName: objectName,
  64. queryValues: urlValues,
  65. contentSHA256Hex: emptySHA256Hex,
  66. })
  67. defer closeResponse(resp)
  68. if err != nil {
  69. return ListObjectPartsResult{}, err
  70. }
  71. if resp != nil {
  72. if resp.StatusCode != http.StatusOK {
  73. return ListObjectPartsResult{}, httpRespToErrorResponse(resp, bucketName, objectName)
  74. }
  75. }
  76. // Decode list object parts XML.
  77. listObjectPartsResult := ListObjectPartsResult{}
  78. err = xmlDecoder(resp.Body, &listObjectPartsResult)
  79. if err != nil {
  80. return listObjectPartsResult, err
  81. }
  82. return listObjectPartsResult, nil
  83. }