Kuvan lähetys Node serverille C++ ohjelmasta

Liittynyt
17.10.2016
Viestejä
486
Tarkoitus on lähettää softassa napattu .jpg kuva Node.JS serverille. Löysin netistä mm. tälläisen ohjeen

Koodi:
<form action="/pictures/upload" method="POST" enctype="multipart/form-data">
  Select an image to upload:
  <input type="file" name="image">
  <input type="submit" value="Upload Image">
</form>
server side use multer package and write post route as following

var express = require('express')
  , router = express.Router()
  , multer = require('multer')

var uploading = multer({
  dest: __dirname + '../public/uploads/',
})

router.post('/upload', uploading, function(req, res) {

})

module.exports = router

Tuohan näyttää helpolta, mutta kuinka tuo kuvan lähetys käytännössä tapahtuu jos se tehdään suoraan koodista? Tuossa esimerkissähän käytetään File nappulaa, josta käyttäjä hakee sopivan kuvan.

Koodissa on tällä hetkellä tälläinen datan lähetys
Koodi:
    /*******************************************************
    This function uses Post method to Send data to websites.
    *******************************************************/
    TSharedRef<IHttpRequest> Request = Http->CreateRequest();
    Request->OnProcessRequestComplete().BindUObject(this, &AVHttpConnector::PostData_response);
    Request->SetURL(FString::Printf(TEXT("localhost:3000/InsertToDatabase")));

    Request->SetHeader(TEXT("User-Agent"), TEXT("X-UnrealEngine-Agent"));
    Request->SetHeader(TEXT("Content-Type"), TEXT("application/x-www-form-urlencoded"));
    Request->SetHeader(TEXT("Accepts"), TEXT("application/json"));

    // We are using Post
    Request->SetVerb("POST");
    // We Create our parameters seperately and then use SetContentAsString to put them inside body when posting
    //UE_LOG(LogTemp, Warning, TEXT("huhuu: %s"), *LocationInWorld)
    FString Content = FString::Printf(TEXT("id=%s&name=%s&department=%s&subject=%s&defect=%s&location=%s&timestamp=%s&locationinworld=%s&owningplayer=%s"), *ID, *RName, *Department, *Subject, *Message, *Location, *Timestamp, *LocationInWorld, *OwningPlayer);
    Request->SetContentAsString(Content);

    // We sent the request
    Request->ProcessRequest();

Tuohon koodiin siis pitäisi saada ujutettua .jpg kuva, joka on kansiossa X. Löytyisikö apuja täältä? Kiitos.
 
En ole mikään webbiohjelmoija, mutta jos nyt jotain hatusta heitän, niin voisko tuolla C++ puolella lukea sen jpg filen kokonaan johonkin binääricontaineriin, muuntaa se vaikka base64 (ettei tule nollia mukaan) ja pistää tuon viestin contenttiin? Ja sit JS päässä vastaanottaa se base64 ja muuntaa takas binääriksi ja pistää talteen.

edit. Ilmeisesti Unreal Enginestä kyse? Siellä näyttäis olevan API:t sekä base64 että tiedostojen luvulle:

File Management, Create Folders, Delete Files, and More - Epic Wiki

FBase64
 
En ole mikään webbiohjelmoija, mutta jos nyt jotain hatusta heitän, niin voisko tuolla C++ puolella lukea sen jpg filen kokonaan johonkin binääricontaineriin, muuntaa se vaikka base64 (ettei tule nollia mukaan) ja pistää tuon viestin contenttiin? Ja sit JS päässä vastaanottaa se base64 ja muuntaa takas binääriksi ja pistää talteen.

edit. Ilmeisesti Unreal Enginestä kyse? Siellä näyttäis olevan API:t sekä base64 että tiedostojen luvulle:

File Management, Create Folders, Delete Files, and More - Epic Wiki

FBase64
Kiitos hyvästä vinkistä. Oon koittanut saada tuota toimimaan, mutta back-end herjaa liian isosta payloadista.

Encoodaan filun (JPG) tällä tavalla.
Koodi:
    // get data
    TArray<uint8> UpFileRawData;
    FFileHelper::LoadFileToArray(UpFileRawData, *TexturePath);
    if (UpFileRawData.Num() == 0)
    {
        PostDataDelegate.Broadcast(false, "Cannot load texture");
        return;
    }

    // Encode JPG to String
    FString ImageEncoded = FBase64::Encode(UpFileRawData);

Sitten lisään tuon koodatun pätkän tuohon muiden parametrien jatkoksi.
Koodi:
FString Content = FString::Printf(TEXT("id=%s&name=%s&department=%s&subject=%s&defect=%s&location=%s&timestamp=%s&locationinworld=%s&owningplayer=%s&EncodedImage=%s"), *ID, *RName, *Department, *Subject, *Message, *Location, *Timestamp, *LocationInWorld, *OwningPlayer, *ImageEncoded);

Back-endissä parametrit otetaan bodysta. Tämä uusi EncodedImage niiden mukana.
Koodi:
            DBConnect.InsertToDatabase(request.body.id, request.body.name, request.body.department, request.body.subject, request.body.defect, request.body.location, "New", request.body.timestamp, request.body.locationinworld, request.body.owningplayer, request.body.EncodedImage, connection, (error, results, fields) => {

Saan virheen: "PayloadTooLargeError: request entity too large"

Ilmeisesti tuota pitäisi jotenkin pakata vai?

edit: Toistaiseksi meni perille kun sääti payload limittiä. Katsotaan mitä tulee kun koitan dekoodata :)

edit2: Toimii. Kuva menee näppärästi serverille! Mahtavaa. Kiitos vielä kerran uuden asian opettamisesta :).
 
Viimeksi muokattu:

Statistiikka

Viestiketjuista
261 838
Viestejä
4 548 753
Jäsenet
74 851
Uusin jäsen
hieunguyen

Hinta.fi

Back
Ylös Bottom