2014-11-13 1 views
1

У меня есть эти доступные интерфейсы:Как загрузить изображение из PhoneGap в Web-интерфейс Asp.Net?

[HttpPost] 
[CorsEnabled] 
[ActionName("upstream")] 
public DTO.Callback UploadPhoto(Stream data) 
{ 
    var m = new Logic.Components.User(); 
    return m.UploadPhoto(data, Common.UserValues().Email); 
} 

[HttpPost] 
[CorsEnabled] 
[ActionName("upbyte")] 
public DTO.Callback UploadPhoto(byte[] data) 
{ 
    var m = new Logic.Components.User(); 
    return m.UploadPhoto(data, Common.UserValues().Email); 
} 

[HttpPost] 
[CorsEnabled] 
[ActionName("upfile")] 
public DTO.Callback UploadPhoto(HttpPostedFileBase data) 
{ 
    var m = new Logic.Components.User(); 
    return m.UploadPhoto(data, Common.UserValues().Email); 
} 

[HttpPost] 
[CorsEnabled] 
[ActionName("up")] 
public DTO.Callback UploadPhoto(DTO.UserPhoto data) 
{ 
    var m = new Logic.Components.User(); 
    return m.UploadPhoto(data, Common.UserValues().Email); 
} 

UserPhoto класса

public class UserPhoto 
{ 
    public string Base64 { get; set; } 
    public byte[] Data { get; set; } 
} 

В коде позади, я стараюсь, чтобы преобразовать или получить эквивалентные байты [] каждый запрос данных.
Если бы я получил правильный байт изображения, тогда я должен идти.

В моем приложении PhoneGap, у меня есть эти коды:

функция, которая открывает камеру:

takePicture: function (success, error) { 
    var s = function (data) { 
      navigator.camera.cleanup(); 
      (success || angular.noop)(data); 
     }, 
     e = function (data) { 
      navigator.camera.cleanup(); 
      (error || angular.noop)(data); 
     }; 

    navigator.camera.getPicture(s, e, 
     { 
      quality: 100, 
      destinationType: Camera.DestinationType.FILE_URI, 
      sourceType: Camera.PictureSourceType.CAMERA, 
      encodingType: Camera.EncodingType.PNG, 
      correctOrientation: true 
     } 
    ); 
} 

Моя первая попытка является преобразование изображения в base64 строку и использовать «вверх» API ,
Он отлично подходит для низких quality не более 50. Но изображение становится почти неузнаваемым. Поэтому я установил quality в 100. И тогда возникает новая проблема, телефон висит ...

Поэтому я попытался использовать FileTransfer. Вот код: использование

fileTransfer: function (filePath, serverUri, mimeType, params, success, error) { 
    var 
     u = $coreData.user.getSession() 
     ; 

    var options = new FileUploadOptions(); 
    options.fileKey = 'file'; 
    options.mimeType = mimeType; 
    options.params = params; 
    options.chunkedMode = true; 
    options.headers = { 
     Connection: 'close', 
     Device: m.createDeviceHeader(), 
     'Authentication-Token': (u && u.SessionKey), 
     'Content-Type': 'application/json' 
    }; 

    var ft = new FileTransfer(); 
    ft.upload(filePath, encodeURI(serverUri), success, error, options); 
} 

Пример:

uploadFile: function (path) { 
    var def = $q.defer(); 
    $coreUtility 
     .fileTransfer(path, $coreAPI.user.getUrl('upfile'), 'image/png', null, 
     function (success) { 


      def.resolve(m.callback(true, UPLOAD_PHOTO_SUCCESS, success)); 
     }, 
     function (error) { 


      def.reject(m.callback(false, UPLOAD_PHOTO_FAIL, error)); 
     }); 
    return def.promise; 
} 

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

ответ

2

Хорошо, я понял. Для других, борющихся за ту же проблему, вот решение.

[HttpPost] 
    [CorsEnabled] 
    [ActionName("upfile")] 
    public DTO.Callback UploadPhoto() 
    { 
     var m = new Logic.Components.User(); 
     return m.UploadPhoto(HttpContext.Current.Request, Common.UserValues().Email); 
    } 

Некоторые логика:

public DTO.Callback UploadPhoto(HttpRequest req, string email) 
    { 
     if (req.Files.Count > 0) 
     { 
      var file = req.Files[0]; 
      var m = new Logic.Components.User(); 
      return m.UploadPhoto(file.InputStream, email); 
     } 

     return new DTO.Callback { Message = "Fail to upload. Make sure that you are uploading an image file." }; 
    } 

Некоторые объяснения о решении:

Первая часть вашего API, а вторая часть является кодом бэкенд.

Чтобы передать поток изображения из PhoneGap к вашему ASP.Net MVC Web API, вы просто должны использовать HttpContext.Current.Request, чтобы получить Stream от PhoneGap.

+0

Не могли бы вы объяснить это решение? спасибо – clintgh

+0

см. мое редактирование ...... – fiberOptics