• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Upload file from Javascript Socket to Golang API (Gin Gonic)

New Here ,
Jan 12, 2018 Jan 12, 2018

Copy link to clipboard

Copied

I am trying to upload a file to my server (Golang) from a photoshop script (javascript)

Here is the service reading the file on the server:

func Post(c *gin.Context) {
    // Read uploaded file
    file, header, err := c.Request.FormFile("file")
    if err != nil {
        c.JSON(utils.BuildError(err))
    }
    if file == nil {
        c.JSON(utils.BuildError(errors.New("no file provided")))
        return
    }
    // Get Client's informations ready to be processed
    var inputDTO InputDTO
    inputDTO.File = file
    inputDTO
.Name = header.Filename
    c.JSON(utils.BuildResponse(inputDTO.addService()))
}

I tested it using this curl request and it works as expected:

curl -i -X POST -H "Content-Type: multipart/form-data" -F "file=@FILE.pdf" localhost:14000/api/v2/items

Result:

c.Request.Header => map[Content-Length:[787347] Expect:[100-continue] Content-Type:[multipart/form-data; boundary=------------------------b01a62679831e49b] User-Agent:[curl/7.46.0] Accept:[*/*]]
c.Request.Body => &{0xc0422a6000 0xc042280180 false false}
header => [some binary]
file => {0xc042080930}

Now, Photoshop javascript only allows the usage of Socket, so I use this script:

function sendDataToServerLocal(filepath, filename) {
    conn
= new Socket;
    reply = "";

    // Read file
    var f = File(filepath);
    f.encoding = 'BINARY';
    f.open("r");
    var fContent = f.read();
    f.close();

    // Connect to server
    if (conn.open("127.0.0.1:14000", "BINARY")) {
        conn.timeout = 20000;
        boundary = Math.random().toString().substr(2);
        content = "--" + boundary
        
+ "Content-Disposition: form-data; name=\"file\"; filename=\"" + filename + ".pdf\"\n"
         + "Content-Type: application/octet-stream\n"
         + "\n"
         + fContent;

        cs
= "POST /api/v2/items HTTP/1.1\n"
         + "Content-Length: " + content.length + "\n"
         + "Content-Type: multipart/form-data; charset=utf-8; boundary=" + boundary + "\n"
         + "Host: 127.0.0.1:14000\n"
         + "User-Agent: Apache-HttpClient/4.3.1 (java 1.5)\n"
         + "Accept: */*\n"
         + "Expect: 100-continue\n"
         + "\n"
         + content
         +
"--" + boundary + "--\n"

        conn
.write(cs);
        reply = conn.read(999999);
        conn.close();
        if (reply.indexOf("200 OK") > 0) {
            alert("File successfully uploaded!");
        } else {
            throw new Error("Error:" + reply);
        }
    } else {
        throw new Error("Can't connect to server");
    }
}

And I get the same nice request, but header and body are nil...

c.Request.Header => map[User-Agent:[Apache-HttpClient/4.3.1 (java 1.5)] Accept:[*/*] Expect:[100-continue] Content-Length:[787299] Content-Type:[multipart/form-data; boundary=XLuvdG51D_BRiiAda_0y79ImMN_ddtKYzeFFLlu8]]
c.Request.Body => &{0xc042278380 0xc04204e2c0 false false}
header => nil
file => nil

Any idea of why the file is nil when sent from the Socket?

Thank you!

TOPICS
Actions and scripting

Views

1.5K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Adobe
Engaged ,
Jan 13, 2018 Jan 13, 2018

Copy link to clipboard

Copied

LATEST

I've used GET request via Socket in the past, not POST. E.g.

var reply = "";

// The HTTP Request string

var req = "GET http://currentmillis.com/time/minutes-since-unix-epoch.php " +

          "HTTP/1.1\r\nHost: currentmillis.com\r\nConnection: close\r\n\r\n";

conn = new Socket();

if (conn.open("www.currentmillis.com:80", "binary")) { // 188.121.45.1

    conn.write(req);

        reply = conn.read(999999);

        $.writeln("Full Reply ---------------\n" + reply);

        conn.close();

        $.writeln("Minutes since Unix epoch: " +

             reply.substr(this.reply.indexOf("\r\n\r\n") + 7, 10));

}

Any chance you can use a CEP Panel, that would be easier...

Davide

Davide Barranca - PS developer and author
www.ps-scripting.com

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines