2012-03-30 59 views
3

我有一个phonegap jquery应用程序,可以打开相机并拍照。将jpg图像的jQuery ajax后置为.net webservice。图像结果损坏

然后我把这张照片张贴到一个.net webservice,至少我已经编码了。

我不能使用phonegap FileTransfer,因为这不是由Bada os支持的,这是必需的。

我已经成功从phonegap FileSystem API加载图像,我已将它附加到.ajax类型中:我甚至从.net端收到它,但当.net将图像保存到服务器时,图像效果损坏

- >>这是一个正确的Base64编码的文件,但有这样的标题 “数据:图像/ JPEG; BASE64,/ 9J/4AAQ ..... =”

怎么办我摆脱这个标题?我应该从.net还是从ajax修剪它?

任何帮助将不胜感激。

这是我的代码:

//PHONEGAP CAMERA ACCESS (summed up) 
navigator.camera.getPicture(onGetPictureSuccess, onGetPictureFail, { quality: 50, destinationType:Camera.DestinationType.FILE_URI }); 
window.resolveLocalFileSystemURI(imageURI, onResolveFileSystemURISuccess, onResolveFileSystemURIError); 
fileEntry.file(gotFileSuccess, gotFileError); 
new FileReader().readAsDataURL(file); 


//UPLOAD FILE 
function onDataReadSuccess(evt) { 
     var image_data = evt.target.result; 
     var filename = unique_id(); 
     var filext = "jpg"; 

     $.ajax({ 
       type : 'POST', 
       url : SERVICE_BASE_URL+"/fotos/"+filename+"?ext="+filext, 
       cache: false, 
       timeout: 100000, 
       processData: false, 
       data: image_data, 
       contentType: 'image/jpeg', 
       success : function(data) { 

          console.log("Data Uploaded with success. Message: "+ data); 
          $.mobile.hidePageLoadingMsg(); 
          $.mobile.changePage("ok.html"); 
         } 
         }); 
      } 

在我的.NET Web服务,这是被调用的方法:

public string FotoSave(string filename, string extension, Stream fileContent) 
{ 
    string filePath = HttpContext.Current.Server.MapPath("~/foto_data/") + "\\" + filename; 
    FileStream writeStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write); 
    int Length = 256; 
    Byte[] buffer = new Byte[Length]; 
    int bytesRead = readStream.Read(buffer, 0, Length); 
    // write the required bytes 
    while (bytesRead > 0) 
    { 
     writeStream.Write(buffer, 0, bytesRead); 
     bytesRead = readStream.Read(buffer, 0, Length); 
    } 
    readStream.Close(); 
    writeStream.Close(); 
} 
+1

什么是传入的EVT paramater? – PsychoDUCK 2012-06-06 20:37:20

回答

1

好吧,我得到它的工作。问题是,当我们使用$阿贾克斯()的结果是什么,必须适应文本转换成HTML,因此,例如你可以把它直接插入标签

<textarea> background-image: data:data:image/jpeg;base64,/9j/4AAQ.....=</textarea> 

但是当你试图转换。 FromBase64String(thestring)甚至.net告诉你“Base64字符串中的无效字符”。

总之,留下$就因为它,我修改我的.NET函数是这样的:

//Convert input stream into string 
StreamReader postReader = new StreamReader(inputStreamFromWebService); 
string base64String = postReader.ReadToEnd(); 
if (base64String.StartsWith("data:")) 
{ 
      //remove unwanted ajax header 
      int indexOfBase64String = base64String.IndexOf(",") + 1; 
      int lenghtOfBase64String = base64String.Length - indexOfBase64String; 
      base64String = base64String.Substring(indexOfBase64String, lenghtOfBase64String); 
    } 

    //Convert from base64 string to byte[] 
    byte[] byteFromString; 
    byteFromString = Convert.FromBase64String(base64String); 
    MemoryStream stream = new MemoryStream(byteFromString); 

    System.IO.FileStream outFile; 
    outFile = new System.IO.FileStream(filePath, System.IO.FileMode.Create, System.IO.FileAccess.Write); 
    outFile.Write(byteFromString, 0, byteFromString.Length); 
    outFile.Close();