diff --git a/routers/repo/attachment.go b/routers/repo/attachment.go
index 5b699abc8d..5df9cdbf12 100644
--- a/routers/repo/attachment.go
+++ b/routers/repo/attachment.go
@@ -152,7 +152,7 @@ func GetAttachment(ctx *context.Context) {
 		return
 	}
 
-	if err = ServeData(ctx, attach.Name, fr); err != nil {
+	if err = ServeData(ctx, attach.Name, attach.Size, fr); err != nil {
 		ctx.ServerError("ServeData", err)
 		return
 	}
diff --git a/routers/repo/download.go b/routers/repo/download.go
index f04dac6aa5..50f893690b 100644
--- a/routers/repo/download.go
+++ b/routers/repo/download.go
@@ -20,7 +20,7 @@ import (
 )
 
 // ServeData download file from io.Reader
-func ServeData(ctx *context.Context, name string, reader io.Reader) error {
+func ServeData(ctx *context.Context, name string, size int64, reader io.Reader) error {
 	buf := make([]byte, 1024)
 	n, err := reader.Read(buf)
 	if err != nil && err != io.EOF {
@@ -31,6 +31,11 @@ func ServeData(ctx *context.Context, name string, reader io.Reader) error {
 	}
 
 	ctx.Resp.Header().Set("Cache-Control", "public,max-age=86400")
+	if size >= 0 {
+		ctx.Resp.Header().Set("Content-Length", fmt.Sprintf("%d", size))
+	} else {
+		log.Error("ServeData called to serve data: %s with size < 0: %d", name, size)
+	}
 	name = path.Base(name)
 
 	// Google Chrome dislike commas in filenames, so let's change it to a space
@@ -76,7 +81,7 @@ func ServeBlob(ctx *context.Context, blob *git.Blob) error {
 		}
 	}()
 
-	return ServeData(ctx, ctx.Repo.TreePath, dataRc)
+	return ServeData(ctx, ctx.Repo.TreePath, blob.Size(), dataRc)
 }
 
 // ServeBlobOrLFS download a git.Blob redirecting to LFS if necessary
@@ -105,7 +110,7 @@ func ServeBlobOrLFS(ctx *context.Context, blob *git.Blob) error {
 				log.Error("ServeBlobOrLFS: Close: %v", err)
 			}
 		}()
-		return ServeData(ctx, ctx.Repo.TreePath, lfsDataRc)
+		return ServeData(ctx, ctx.Repo.TreePath, meta.Size, lfsDataRc)
 	}
 
 	return ServeBlob(ctx, blob)