diff --git a/s3/s3.go b/s3/s3.go
index ea0dc2bfc827ea4577202998a403b034ef5b2302..f2639419b18db2e7449335b82db8f724fabac981 100644
--- a/s3/s3.go
+++ b/s3/s3.go
@@ -9,6 +9,9 @@ import (
 	"strings"
 	"time"
 
+	"github.com/aws/aws-sdk-go/aws/awserr"
+	"gitlab.com/uafrica/go-utils/errors"
+
 	"github.com/aws/aws-sdk-go/aws/session"
 
 	"github.com/aws/aws-sdk-go/aws"
@@ -138,9 +141,37 @@ func (s SessionWithHelpers) GetSignedDownloadURL(bucket string, fileName string,
 	}
 	getRequest, _ := s.S3Session.GetObjectRequest(getInput)
 
+	fileExists, err := s.FileExists(bucket, fileName)
+	if err != nil {
+		return "", err
+	}
+
+	if !fileExists {
+		return "", errors.Error("File does not exist")
+	}
+
 	return getRequest.Presign(duration)
 }
 
+func (s SessionWithHelpers) FileExists(bucket string, fileName string) (bool, error) {
+	_, err := s.S3Session.HeadObject(&s3.HeadObjectInput{
+		Bucket: aws.String(bucket),
+		Key:    aws.String(fileName),
+	})
+	if err != nil {
+		if aerr, ok := err.(awserr.Error); ok {
+			switch aerr.Code() {
+			case "NotFound": // s3.ErrCodeNoSuchKey does not work, aws is missing this error code so we hardwire a string
+				return false, nil
+			default:
+				return false, err
+			}
+		}
+		return false, err
+	}
+	return true, nil
+}
+
 // UploadWithFileExtension will upload a file to S3 and return a standard S3UploadResponse.
 func (s SessionWithHelpers) UploadWithFileExtension(data []byte, bucket, filePrefix string, fileExt string, mimeType MIMEType, isDebug bool) (*S3UploadResponse, error) {
 	fileName := fmt.Sprintf("%s_%s.%s", filePrefix, uuid.New().String(), fileExt)