0

我正在编写一个 Web 应用程序,它将图像从 Web 保存到数据库。目前,我用来保存图像的方法如下:

[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
}

图像对象:

[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;
}

使用它时,这是我从浏览器获得的图像源(当原始图像只有 ~500 KB 时超过 2 MB):

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

当用作源时,它会正确显示。但是,由于这不是一个实际的 URL(并且WebClient.DownloadData()仅限于小于 260 个字符的 URL),我一直在尝试其他方法来将此数据保存到我的数据库中。但是,我似乎找不到将其保存为与WebClient.DownloadData(). 例如,我研究了将 base 64 字符串转换为图像并保存它,大多数答案似乎都在使用Convert.FromBase64String(),但使用它似乎以不同的格式保存到我的数据库:

0x64006100740061003A0069006D0[...]10051004500420041005100450042004

试图System.Convert.ToBase64String()在这个回报上使用

ZABhAHQAYQA6AGkAbQBhAGcAZQAvAGIAbQBwADsAYgBh[...]UwBlAFIAWQBlAG0ANAA5ADMASQBIAEEAZgBpAEgAVwBxADYAdgBLAGwATwB2AC8AWgA=

这与我使用Convert.FromBase64String()的不同。我在谷歌上找到的其他东西,试图让它以相同的格式保存或显示为图像,到目前为止还没有奏效。

因此,我想知道是否存在将结果从 a 转换FileReader为与 URL 相同的格式的方法WebClient.DownloadData(),或者是否有某种方法可以将0x6400[...]数据转换为可以通过将其用作<img>源来显示的格式。

4

1 回答 1

0

事实证明,保存到数据库中的数据以开头0x64006100[....]而不是开头的原因0xFFD8FFE0[...]是由于我忘记剥离初始的 URI data:image;base64,。完成此操作后,所有内容都会保存并使用System.Convert.ToBase64String().

于 2013-10-08T14:58:41.280 回答