diff --git a/api.go b/api.go
index 5f5ab0e..11f496d 100644
--- a/api.go
+++ b/api.go
@@ -183,16 +183,23 @@
 	blobId := vars["blobId"]
 	fs, err := a.dbMan.getLocalFSLocation(blobId)
 	if err != nil {
-		a.writeInternalError(w, "BlobId "+blobId+" has no mapping blob file")
+		if err == sql.ErrNoRows {
+			a.writeError(w, http.StatusNotFound, API_ERR_NOT_FOUND, "cannot find the blob")
+		} else {
+			log.Errorf("apiReturnBlobData error from db: %v", err)
+			a.writeInternalError(w, "BlobId "+blobId+" has no mapping blob file")
+		}
 		return
 	}
 	byte, err := ioutil.ReadFile(fs)
 	if err != nil {
+		log.Errorf("apiReturnBlobData error read file: %v, %v", fs, err)
 		a.writeInternalError(w, err.Error())
 		return
 	}
 	_, err = io.Copy(w, bytes.NewReader(byte))
 	if err != nil {
+		log.Errorf("apiReturnBlobData error copy file: %v, %v", fs, err)
 		a.writeInternalError(w, err.Error())
 	}
 	w.Header().Set("Content-Type", headerSteam)
diff --git a/api_test.go b/api_test.go
index 630d993..bcd177a 100644
--- a/api_test.go
+++ b/api_test.go
@@ -369,7 +369,7 @@
 	})
 
 	Context("GET /blobs", func() {
-		It("should get file bytesfrom endpoint", func() {
+		It("should get file bytes from endpoint", func() {
 			// setup http client
 			uri, err := url.Parse(apiTestUrl)
 			Expect(err).Should(Succeed())
@@ -396,6 +396,33 @@
 			Expect(err).Should(Succeed())
 			Expect(string(body)).Should(Equal(randString))
 		})
+
+		It("should get error reponse", func() {
+			// setup http client
+			uri, err := url.Parse(apiTestUrl)
+			Expect(err).Should(Succeed())
+			uri.Path = blobEndpointPath + strconv.Itoa(testCount) + "/" + util.GenerateUUID()
+
+			// set test data
+			testData := [][]interface{}{
+				{"", sql.ErrNoRows},
+				{"", fmt.Errorf("test error")},
+			}
+			expectedCode := []int{
+				http.StatusNotFound,
+				http.StatusInternalServerError,
+			}
+
+			for i, data := range testData {
+				dummyDbMan.localFSLocation = data[0].(string)
+				dummyDbMan.err = data[1].(error)
+				// http get
+				res, err := http.Get(uri.String())
+				Expect(err).Should(Succeed())
+				res.Body.Close()
+				Expect(res.StatusCode).Should(Equal(expectedCode[i]))
+			}
+		})
 	})
 
 	Context("GET /configurations/{configId}", func() {
diff --git a/data.go b/data.go
index e99cba7..558c133 100644
--- a/data.go
+++ b/data.go
@@ -381,25 +381,22 @@
 
 }
 
-func (dbc *dbManager) getLocalFSLocation(blobId string) (localFsLocation string, err error) {
+func (dbc *dbManager) getLocalFSLocation(blobId string) (string, error) {
 
 	log.Debugf("Getting the blob file for blobId {%s}", blobId)
-	rows, err := dbc.getDb().Query("SELECT local_fs_location FROM APID_BLOB_AVAILABLE WHERE id = '" + blobId + "'")
+	localFsLocation := sql.NullString{}
+	err := dbc.getDb().QueryRow("SELECT local_fs_location FROM APID_BLOB_AVAILABLE WHERE id = '" + blobId + "'").Scan(&localFsLocation)
 	if err != nil {
-		log.Errorf("SELECT local_fs_location failed %v", err)
+		if err != sql.ErrNoRows {
+			log.Errorf("SELECT local_fs_location failed %v", err)
+		}
 		return "", err
 	}
-
-	defer rows.Close()
-	for rows.Next() {
-		err = rows.Scan(&localFsLocation)
-		if err != nil {
-			log.Errorf("Scan local_fs_location failed %v", err)
-			return "", err
-		}
-		log.Debugf("Got the blob file {%s} for blobId {%s}", localFsLocation, blobId)
+	if localFsLocation.Valid {
+		return localFsLocation.String, nil
 	}
-	return
+	log.Warnf("local_fs_location for blob %s is null!", blobId)
+	return "", nil
 }
 
 func (dbc *dbManager) loadLsnFromDb() error {
diff --git a/data_test.go b/data_test.go
index 65aace8..43ca0c8 100644
--- a/data_test.go
+++ b/data_test.go
@@ -202,6 +202,9 @@
 			location, err := testDbMan.getLocalFSLocation(testBlobId)
 			Expect(err).Should(Succeed())
 			Expect(location).Should(Equal(testBlobLocalFsPrefix + testBlobId))
+			// negative test
+			location, err = testDbMan.getLocalFSLocation("non-existent")
+			Expect(err).Should(Equal(sql.ErrNoRows))
 		})
 
 		It("should get configuration by Id", func() {
diff --git a/mock_test.go b/mock_test.go
index f8f804a..fb0e06f 100644
--- a/mock_test.go
+++ b/mock_test.go
@@ -63,7 +63,7 @@
 }
 
 func (d *dummyDbManager) getLocalFSLocation(string) (string, error) {
-	return d.localFSLocation, nil
+	return d.localFSLocation, d.err
 }
 
 func (d *dummyDbManager) getConfigById(id string) (*Configuration, error) {
