Kuvan lähetys Node serverille C++ ohjelmasta

Viestiketju alueella 'Ohjelmointi, pelikehitys ja muu sovelluskehitys' , aloittaja Jean_Sipulius, 15.11.2018.

  1. Jean_Sipulius

    Jean_Sipulius

    Viestejä:
    257
    Rekisteröitynyt:
    17.10.2016
    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.
     
  2. Partizan

    Partizan

    Viestejä:
    13
    Rekisteröitynyt:
    23.10.2016
    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
     
  3. Jean_Sipulius

    Jean_Sipulius

    Viestejä:
    257
    Rekisteröitynyt:
    17.10.2016
    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: 19.11.2018