2017-07-18 3 views
3

こんにちは私はangularjsアプリケーションを開発しています。私はファイルアップロードモジュールをやっています。私はファイルを検証しようとしています。 xlsxまたはxlsファイルのみをアップロードしたいと思います。私は以下のようにファイルをアップロードするためのディレクティブとファクトリメソッドを開発しました。Angularjsファイル名の拡張子を取得する方法は?

myapp.directive('fileModel', ['fileUploadExcel', function (fileUploadExcel) { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      element.bind("change", function (evt) { 
       fileUploadExcel.pendingFiles[attrs.fileModel] = evt.target.files[0]; 
      }); 
     } 
    }; 
}]); 

以下はマイコンです。

$scope.upload = function (filename) { 
fileUploadExcel.doUpload().success(function (success) { 
}).error(function (error) { 
}); 

以下は私の工場コードです。

myapp.factory('fileUploadExcel', ['$http', '$cookieStore', 'cfg', function ($http, $cookieStore, cfg) { 
    var LoginID = $cookieStore.get("LoginID"); 
    var baseurl = cfg.Baseurl; 
    var fileuploadurl = baseurl + 'api/Customer/BulkUploadVehicle/'; 

    var service = { 
     uploadUrl: fileuploadurl, 
     pendingFiles: {}, 
     doUpload: doUpload 
    }; 
    return service; 
    function doUpload() { 
     var filename; 
     var files = new FormData(); 
     files.append('LoginID', LoginID); 
     angular.forEach(this.pendingFiles, function (value, index) { 
      filename = value.name; 
      files.append(index, value); 
     }); 
     var extn = filename.split(".").pop(); 
     if (extn == 'xlsx' || extn == 'xls') { 
      return $http.post(this.uploadUrl, files, { 
       transformRequest: angular.identity, 
       headers: { 
        'Content-Type': undefined 
       } 
      }) 
     } 
     else 
     { 
      return false; 
     } 
    } 
}]); 

私は正常にextnを取得できます。私のファイルの種類がExcelの場合、コードは正常に動作します。私はExcel以外のアップロードするたびにエラーが表示されます。私は返品虚偽を書きました。これはここでは機能しません。私は他の何かを返すべきです。そうでなければ何を書かなければならないのか分かりますか?誰でもここで私を助けることができますか?どんな助けもありがとう。ありがとうございました。

+0

xlsxやxls拡張機能以外のファイルをアップロードしようとするとどうなりますか? if条件をパスしますか? –

+0

ありがとうrahul。私がExcel以外のファイルをアップロードするたびに、エラーfileUploadExcel.doUpload(...)が発生します。成功は関数ではありません –

+0

ahh..got it ..答えを確認しますか? –

答えて

2

あなたが別の型を返す:代わりにfalseを返す

私は、ファイルはエクセルのラインに沿ってファイルではありませんときに拒否された約束を返す示唆しますあなたの工場ではhttpの約束だから、あなたのコントローラーで成功を&エラー関数と呼ぶことができます:

fileUploadExcel.doUpload().success()が存在します!

が、エラーならば、あなたは工場でfalseを返し、この場合には、これはブール値であり、あなたが成功&誤差関数を使用傾けるように、$はhttpの約束ではありません。

fileUploadExcel.doUpload().success()doesntが存在し、その溶液を返却値がfalseでないかどうかを確認し、あなたのコードを継続することであるもちろん、エラー

を返しますが、私はそれを解決することによって、常に約束を返すことをお勧めあれば成功とエラーでそれを拒否する、ので、約束チェーンは壊れていません。

PS:$ HTTPは、彼らが成功&エラーがありますが、私はバニラの約束を使用して)(

var deferred = $q.defer(); 

if (extn === 'xlsx' || extn === 'xls') { 
    $http.post(this.uploadUrl, files, { 
     transformRequest: angular.identity, 
     headers: { 
      'Content-Type': undefined 
     } 
    }).success(function(success) { 
     deferred.resolve(success); 
    }).error(function(error) { 
     deferred.reject(error); 
    }); 
} else { 
    deferred.reject('File format not supported'); 
} 
return deferred.promise; 

とあなたのコントローラを.then使用することをお勧めする理由修正約束です:

$scope.upload = function (filename) { 
    fileUploadExcel.doUpload().then(function (success) { 
     //success 
    }, function (error) { 
     //error 
    }); 
} 
+0

ありがとうございます。どこでも$ qを宣言すべきですか?私は$ qが定義されていません –

+0

$ qはあなたの工場で注入する必要がありますhttps://docs.angularjs.org/api/ng/service/$q – Fetrarij

+0

はい。ありがとうございました。私はqについて考えていませんでした。私は非同期呼び出しを行った。 –

1

代わりにこれを試しましたか?

$scope.upload = function (filename) { 
    var promise = fileUploadExcel.doUpload(); //gets promise object in a variable 
    if(promise){ // if variable is not false or null, handle resolution 
    promise.success(function (success) { }).error(function (error) {}); 
    } 
} 

またはあなたの工場でelsenullを返し、nullのチェックを行うことができます。上記のコードは同じままです。

3

doUpload()falseを返すと、エラーがスローされます。 falseはブール値であり約束ではないので、.success()は定義されません。

成功した場合に

、あなたは$を返す: return $q.reject("File type not supported: " + extn);

+0

これを行うには、 '$ http'をどのように注入したのかと同様に、' $ q'サービスを 'fileUploadExcel'ファクトリに注入する必要があります。 –

関連する問題