2013-10-07 5 views
0

Я пишу веб-приложение, которое сохраняет изображения из Интернета в базу данных. В настоящее время, что я использую для сохранения изображений заключается в следующем:System.Convert.ToBase64String возвращает другой результат, чем вход в System.Convert.FromBase64String

[WebMethod] 
public static void Save(string pictures) 
{ 
    // pictures is an object containing the URL of the image along with some metadata 
    List<ImageObject> imageList = new JavaScriptSerializer().Deserialize<List<ImageObject>>(pictures); 
    for (int i = 0; i < imageList.Count; i++) 
    { 
     var webClient = new WebClient(); 
     byte[] byteArray = webClient.DownloadData(imageList[i].URL); 
     imageList[i].Picture = byteArray; 
    } 
    // some SQL to save imageList 
} 

ImageObject:

[DataContract] 
public class ImageObject 
{ 
    [DataMember] 
    public string URL { get; set; } 
    [DataMember] 
    public string Picture { get; set; } 
} 

Теперь, это прекрасно работает для загрузки с URL. Запись сохраняется в моей базе данных:

0xFFD8FFE000104A464946000101[...]331B7CCA7F0AD3A02DC8898F 

Чтобы отобразить это изображение, я просто называю System.Convert.ToBase64String() после извлечения его и использовать его в качестве изображения src. Тем не менее, теперь я пытаюсь добавить некоторые функции для загрузки пользователями собственных изображений. Моя функция для этого вызывается из <input />:

function uploadPicture(){ 
    var numPics = document.getElementById("uploadedPictures").files.length; 
    var oFReader = new FileReader(); 
    oFReader.onload = function (oFREvent) { 
     var src = oFREvent.target.result; 
     document.getElementById('image').src = src; 
    } 
    oFReader.readAsDataURL(document.getElementById("uploadedPictures").files.length; 
} 

При использовании этого, это исходное изображение, я получаю от браузера (более 2 МБ, если оригинал только ~ 500 KB):

data:image/bmp;base64,/9j/4AAQSkZJRgABAgEAY[...]k8tTMZEBCsEbSeRYem493IHAfiHWq6vKlOv/Z 

Это изображение отображается правильно при использовании в качестве источника. Однако, так как это не фактический URL (а WebClient.DownloadData() ограничен URL-адресами < 260 символов), я пытался использовать другие методы для сохранения этих данных в моей базе данных. Однако я не могу найти функцию, чтобы сохранить ее в том же формате, что и WebClient.DownloadData(). Например, я посмотрел на converting a base 64 string to an image and saving it, где большинство ответов, кажется, использовать Convert.FromBase64String(), но используя это, кажется, сохранить в другом формате в моей базе данных:

0x64006100740061003A0069006D0[...]10051004500420041005100450042004 

Попытка использовать System.Convert.ToBase64String() на это возвращает

ZABhAHQAYQA6AGkAbQBhAGcAZQAvAGIAbQBwADsAYgBh[...]UwBlAFIAWQBlAG0ANAA5ADMASQBIAEEAZgBpAEgAVwBxADYAdgBLAGwATwB2AC8AWgA= 

который отличается от того, что я использовал Convert.FromBase64String() сверху. Другие вещи, которые я нашел в Google, чтобы попытаться сохранить его в том же формате или отобразить, пока изображение не работает до сих пор.

Следовательно, мне интересно, существует ли способ, чтобы преобразовать результат из FileReader в том же формате, как WebClient.DownloadData() делает для URL-адресов, или если есть какой-то способ, чтобы преобразовать данные 0x6400[...] в формат, который может быть отображен с помощью это как источник <img>.

ответ

0

Оказалось, что причина, по которой данные, сохраненные в базе данных, начинались с 0x64006100[....], а не 0xFFD8FFE0[...], было связано с тем, что я забыл убрать URI начального data:image;base64,. После этого все сохраняет и читается правильно, используя System.Convert.ToBase64String().

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