Kaynağa Gözat

DownloadFile support range

鸣镝 8 yıl önce
ebeveyn
işleme
ec5d28c34a
3 değiştirilmiş dosya ile 90 ekleme ve 6 silme
  1. 78 4
      oss/download_test.go
  2. 1 1
      oss/utils.go
  3. 11 1
      oss/utils_test.go

+ 78 - 4
oss/download_test.go

@@ -360,6 +360,7 @@ func (s *OssDownloadSuite) TestDownloadWithRange(c *C) {
 	objectName := objectNamePrefix + "tdwr"
 	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
 	newFile := "down-new-file-tdwr.jpg"
+	newFileGet := "down-new-file-tdwr-2.jpg"
 
 	// 上传文件
 	err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
@@ -370,7 +371,7 @@ func (s *OssDownloadSuite) TestDownloadWithRange(c *C) {
 
 	// 范围下载,从1024到4096
 	os.Remove(newFile)
-	err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), Range(1024, 4096))
+	err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), Range(1024, 4095))
 	c.Assert(err, IsNil)
 
 	// check
@@ -378,9 +379,18 @@ func (s *OssDownloadSuite) TestDownloadWithRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, Range(1024, 4095))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	// 范围下载,从1024到4096
 	os.Remove(newFile)
-	err = s.bucket.DownloadFile(objectName, newFile, 1024, Routines(3), NormalizedRange("1024-4096"))
+	err = s.bucket.DownloadFile(objectName, newFile, 1024, Routines(3), NormalizedRange("1024-4095"))
 	c.Assert(err, IsNil)
 
 	// check
@@ -388,6 +398,15 @@ func (s *OssDownloadSuite) TestDownloadWithRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, NormalizedRange("1024-4095"))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	// 范围下载,从2048到结束
 	os.Remove(newFile)
 	err = s.bucket.DownloadFile(objectName, newFile, 1024*1024, Routines(3), NormalizedRange("2048-"))
@@ -398,6 +417,15 @@ func (s *OssDownloadSuite) TestDownloadWithRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, NormalizedRange("2048-"))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	// 范围下载,最后4096个字节
 	os.Remove(newFile)
 	err = s.bucket.DownloadFile(objectName, newFile, 1024, Routines(3), NormalizedRange("-4096"))
@@ -408,6 +436,15 @@ func (s *OssDownloadSuite) TestDownloadWithRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, NormalizedRange("-4096"))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	err = s.bucket.DeleteObject(objectName)
 	c.Assert(err, IsNil)
 }
@@ -417,6 +454,7 @@ func (s *OssDownloadSuite) TestDownloadWithCheckoutAndRange(c *C) {
 	objectName := objectNamePrefix + "tdwcr"
 	fileName := "../sample/BingWallpaper-2015-11-07.jpg"
 	newFile := "down-new-file-tdwcr.jpg"
+	newFileGet := "down-new-file-tdwcr-2.jpg"
 
 	// 上传文件
 	err := s.bucket.UploadFile(objectName, fileName, 100*1024, Routines(3))
@@ -427,7 +465,7 @@ func (s *OssDownloadSuite) TestDownloadWithCheckoutAndRange(c *C) {
 
 	// 范围下载,从1024到4096
 	os.Remove(newFile)
-	err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), Checkpoint(true, ""), Range(1024, 4096))
+	err = s.bucket.DownloadFile(objectName, newFile, 100*1024, Routines(3), Checkpoint(true, ""), Range(1024, 4095))
 	c.Assert(err, IsNil)
 
 	// check
@@ -435,9 +473,18 @@ func (s *OssDownloadSuite) TestDownloadWithCheckoutAndRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, Range(1024, 4095))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	// 范围下载,从1024到4096
 	os.Remove(newFile)
-	err = s.bucket.DownloadFile(objectName, newFile, 1024, Routines(3), Checkpoint(true, ""), NormalizedRange("1024-4096"))
+	err = s.bucket.DownloadFile(objectName, newFile, 1024, Routines(3), Checkpoint(true, ""), NormalizedRange("1024-4095"))
 	c.Assert(err, IsNil)
 
 	// check
@@ -445,6 +492,15 @@ func (s *OssDownloadSuite) TestDownloadWithCheckoutAndRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, NormalizedRange("1024-4095"))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	// 范围下载,从2048到结束
 	os.Remove(newFile)
 	err = s.bucket.DownloadFile(objectName, newFile, 1024*1024, Routines(3), Checkpoint(true, ""), NormalizedRange("2048-"))
@@ -455,6 +511,15 @@ func (s *OssDownloadSuite) TestDownloadWithCheckoutAndRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, NormalizedRange("2048-"))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	// 范围下载,最后4096个字节
 	os.Remove(newFile)
 	err = s.bucket.DownloadFile(objectName, newFile, 1024, Routines(3), Checkpoint(true, ""), NormalizedRange("-4096"))
@@ -465,6 +530,15 @@ func (s *OssDownloadSuite) TestDownloadWithCheckoutAndRange(c *C) {
 	c.Assert(err, IsNil)
 	c.Assert(eq, Equals, true)
 
+	os.Remove(newFileGet)
+	err = s.bucket.GetObjectToFile(objectName, newFileGet, NormalizedRange("-4096"))
+	c.Assert(err, IsNil)
+
+	// compare get and download
+	eq, err = compareFiles(newFile, newFileGet)
+	c.Assert(err, IsNil)
+	c.Assert(eq, Equals, true)
+
 	err = s.bucket.DeleteObject(objectName)
 	c.Assert(err, IsNil)
 }

+ 1 - 1
oss/utils.go

@@ -122,7 +122,7 @@ func adjustRange(ur *unpackedRange, size int64) (start, end int64) {
 
 	if ur.hasStart && ur.hasEnd {
 		start = ur.start
-		end = ur.end
+		end = ur.end + 1
 		if ur.start < 0 || ur.end > size || ur.start > ur.end {
 			start = 0
 			end = size

+ 11 - 1
oss/utils_test.go

@@ -133,6 +133,16 @@ func (s *OssUtilsSuite) TestParseRange(c *C) {
 	c.Assert(err, NotNil)
 	c.Assert(err.Error(), Equals, "InvalidRange bytes=-0")
 
+	// InvalidRange bytes=1-2-3
+	_, err = parseRange("bytes=1-2-3")
+	c.Assert(err, NotNil)
+	c.Assert(err.Error(), Equals, "InvalidRange bytes=1-2-3")
+
+	// InvalidRange bytes=1-N
+	_, err = parseRange("bytes=1-N")
+	c.Assert(err, NotNil)
+	c.Assert(err.Error(), Equals, "InvalidRange bytes=1-N")
+
 	// ranges=M-N
 	ur, err := parseRange("bytes=1024-4096")
 	c.Assert(err, IsNil)
@@ -173,7 +183,7 @@ func (s *OssUtilsSuite) TestAdjustRange(c *C) {
 	c.Assert(end, Equals, (int64)(8192))
 
 	// 1024-4096
-	ur := &unpackedRange{true, true, 1024, 4096}
+	ur := &unpackedRange{true, true, 1024, 4095}
 	start, end = adjustRange(ur, 8192)
 	c.Assert(start, Equals, (int64)(1024))
 	c.Assert(end, Equals, (int64)(4096))