2014-02-14 7 views
4

Проблемы с загрузкой файлов в приложении Angularjs/Nodejs.Angularjs, Загрузка файлов и IE9

Я внедрил эту директиву angular-file-upload. Используя его, загрузка файлов работает во всех современных браузерах, но в IE9 он не работает. Под «fail» я имею в виду, что он работает так, как будто он работает ... Я могу зарегистрировать ход загрузки файла и увидеть, что он постепенно достигает 100%, сообщение успешного журнала запускается в обработчике успеха (ничего не запускается в обработчике ошибок), но файл никогда не появляется в каталоге загрузки (на том же компьютере).

Нет никаких консольных ошибок любого типа, и я устанавливаю разрешения на загрузку каталога на 777, чтобы исключить это.

вещи, которые я нашел, что выключены ... первых, файлы, загруженные в IE9 не вызывают сообщения журнала я поместил в моей функции uploadPhoto поэтому маршрут, кажется, даже не ударять (мыслительные файлы загружены в современных браузеры DO запускают эти сообщения журнала). Кроме того, после загрузки на панели «Сеть» инструментов разработчика значение для типа не должно быть text/html, как показано ниже.

(приведенные ниже карты для: URL, Method, Result, Type, Received):

/path/to/upload-dir/filename.jpg GET 200 text/html 20.7kb 

Вот мой обработчик загрузки файла:

$scope.onFileSelect = function ($file) { 
    $scope.ajaxVisible = true; 
    $scope.uploadError = false; 
    var photo = $file[0]; 
    $scope.upload = $upload.upload({ 
     url: '/upload/photo', 
     file: photo, 
     method: 'POST' 
    }).progress(function (evt) { 
     }).success(function (data, status, headers, config) { 
      $scope.toggleUploadForm(); 
      $scope.imgsrc = 'path/to/upload/dir/' + photo.name; 
      User.currentUser.profile_image = photo.name; 
      User.updateUser(); 
      $scope.ajaxVisible = false; 
     }).error(function (err) { 
      $scope.uploadError = true; 
      $scope.ajaxVisible = false; 
     }); 
}; 

Вот обработчик для этого маршрута (expressjs/узел):

app.post('/upload/photo', userAPI.uploadPhoto); 

Это uploadPhoto, на которое ссылается обработчик маршрута:

exports.uploadPhoto = function(req, res) { 
    logger.info('inside uploadPhoto'); // <-- never reached using IE9 
    var callbacks = {}; 

    callbacks.uploadSuccess = function(){ 
     res.json('success'); 
    }; 

    callbacks.uploadFailure = function(err){ 
     res.json(400, 'Error uploading image.'); 
    }; 

    user.handlePhotoUpload(req.files, callbacks); 
}; 

Который, наконец, руки вещи прочь:

this.handlePhotoUpload = function(params, callbacks) { 
     logger.log('inside handlePhotoUpload'); // <-- never reached using IE9 
     if(params.file.mime !== 'image/png' && params.file.mime !== 'image/jpeg' && params.file.mime !== 'image/gif') { 
      callbacks.uploadFailure('Wrong file type'); 
      return; 
     } 
     fs.readFile(params.file.path, function(err, data){ 
      if(err){ 
       callbacks.uploadFailure(err); 
      } 
      var newPath = path.resolve("./path/to/upload/dir/" + params.file.filename); 
      fs.writeFile(newPath, data, function(err) { 
       if(err){ 
        callbacks.uploadFailure(err); 
       } 

       callbacks.uploadSuccess(); 
      }); 
     }); 
    }; 

Эта директива использует FileAPI library на внутреннем интерфейсе и требует Flash, чтобы управлять процессом загрузки. Я предполагаю, что Flash является источником проблемы. Я что-то пропускаю, но не знаю, что это может быть.

Как я уже говорил, ошибки в консоли (в любом браузере) и загрузка файлов не показывают все признаки работы, за исключением того, что файл никогда не появляется в каталоге загрузки. Но при загрузке через IE9 при загрузке через современный браузер никогда не достигаются различные операторы журналов.

Рекомендации по устранению неполадок также приветствуются, как предложения решений.

ответ

1

Так что я решил это. Преступник находится в моем собственном коде (естественно ... Вздох) и этот бит:

if(params.file.mime !== 'image/png' && params.file.mime !== 'image/jpeg' && params.file.mime !== 'image/gif') { 
    callbacks.uploadFailure('Wrong file type'); 
    return; 
} 

Поскольку эта директива использует вспышку для ее перехода на аварийный режим загрузки (для старых, пухленький, браузеры как IE < = 9) мима тип загрузки на самом деле application/octet-stream ... не один из типов изображений mime, проверенных в приведенном выше коде. Поэтому, добавив, что тип mime для моей проверки позволил загружать изображения вспышкой (таким образом, IE < = 9).

Кроме того, я неправильно использовал это сообщение об ошибке «Неверный тип файла» в моем журнале.У меня есть:

callbacks.uploadFailure = function(err){ 
    res.json(400, 'Error uploading image.'); 
}; 

Как вы можете видеть, err не используется, так что конкретные, информативный, сообщение об ошибке исчезает к моменту, когда ошибка регистрируется, и я только получить относительно общей «Ошибка при загрузке изображения.»

Смежные вопросы