0

我是 asp.net 和 Restful 网络服务的新手。
我想使用 Rest api 将我的图片从我的 Qt 项目发送到我的服务器。
我用opencv读取我的图像并将其转换为base64并通过这样的url发送它:

Mat img = imread("C:\\Users\\piltan\\Downloads\\remove.jpg");
cv::resize(img,img,Size(30,30));
string encoded = base64_encode(img.data, img.rows *img.cols);
QString qenc = QString::fromStdString(encoded);
//cout<<encoded<<endl;
//qenc = "sa";
QEventLoop eventLoop;
QNetworkAccessManager mgr;
QObject::connect(&mgr,SIGNAL(finished(QNetworkReply*))
,&eventLoop,SLOT(quit()));
QNetworkRequest req( QUrl( QString("http://localhost:60733/api/Weather? 
id=")+qenc) );

在服务器端,我有一个控制器类,可以在其中成功接收我的图像字符串。

这是我的接收方法:

在此处输入图像描述

并将字符串长度检索到我的 Qt 客户端。

这是我的输出:

  "Image length 1200"

所以我可以成功发送和接收我的数据。
现在我想在网络表单和浏览器中显示这个 base64 图像。
我在我的项目中添加了一个新的 web 表单,并在其中放置了一个 webcontrol 图像:

在此处输入图像描述 但我不知道如何将接收到的数据分配给我放置的图像对象。
正如我所说,我是新手,不熟悉 Rest api。
有谁能够帮我 ?非常感谢。

4

1 回答 1

1

我鼓励您将图像单独上传到您的网络服务器,而不是将其作为 base64 发送。特别是如果您使用 URL 或 JSON 请求发送 base64 数据,您的请求正文的大小有一些限制,并且可能会给您的应用程序和服务器后端带来问题。

相反,您可以使用 HTTPmultipart请求并使用它发送您的图像数据。

这是一个 Gist 的链接,您可以在其中看到一个工作示例: https ://gist.github.com/wzyuliyang/ffc0217015658b87e3fd

它使用python作为服务器后端,但整个过程就是你想要的。例如,在 Qt 实现中,您可以看到如何使用moltipart表单数据发送图像数据:

//path image
QString path("d:\\people3.jpeg");
//php script that receives the image
QNetworkRequest requete(QUrl("http://*.*.*.*:8080/upload"));

QByteArray boundary = "------WebKitFormBoundarytoHka8LUGjq34sBN";
QFile file(path);
if (!file.open(QIODevice::ReadOnly))
{
    qDebug()<<"error read image";
    return;
}
QByteArray fileContent(file.readAll());

QByteArray data = boundary + "\r\n";
data += "Content-Disposition: form-data; name=\"file\"; filename=\"people3.jpeg\"\r\n";
data += "Content-Type: image/jpeg\r\n\r\n" + fileContent + "\r\n";
data += boundary + "--\r\n";
requete.setRawHeader("Content-Type", "multipart/form-data; boundary=----WebKitFormBoundarytoHka8LUGjq34sBN");
requete.setRawHeader("Content-Length", QString::number(data.size()).toLatin1 ());
file.close();
QNetworkAccessManager *am = new QNetworkAccessManager(this);
QNetworkReply *reply = am->post(requete,data);

QObject::connect(am, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));

希望能帮助到你。

更新:

使用这种方法,您将在服务器中存储一个图像文件,然后您可以设置标签的src属性来查看它。img例如:

<img src="http://localhost:8080/images/myimg.jpg">

但是如果你想在图像上显示 base64 内容,你应该这样做:

<img src="data:image/jpeg;base64,/9j/4AAQSk...">

因此,在您的 ASP.NET Web 表单中,假设您有一个名为 的图像控件image1,您可以像这样显示 base64 图像:

string imgString = "/9j/4AAQSk..."; // Place your actual base64 string here
image1.ImageUrl = String.Format("data:image/jpeg;base64,{0}", imgString);

此外,如果您在字符串中包含图像类型,您可以简单地使用:

string imgString = "data:image/jpeg;base64,/9j/4AAQSk..."; // Place your actual base64 string here
image1.ImageUrl = imgString;
于 2019-09-24T14:35:18.753 回答