Download a file from BlobFile attribute - genexus

I'm testing a bit with blobfile data type in Genexus but I can't understand how to download a file I have previously saved in it, the wiki page didn't help. The attribute has not methods or thing that looks useful. Someone can help me?

Using a proc with HTTP call protocol and returning the file.
Suppose you have a transaction with this structure:
FilesToDownloadId*
FilesToDownloadFile - Defined as BlobFile
Suppose you have a Webpanel with a grid showing a list of files (both attributtes) and &Download variable is just a char variable to use the "link" function.
Event Load
&Download="Download"
&Download.Link=DownloadFile.Link(FilesToDownloadId)
Endevent
DownloadFile is a proc with "Call Protocol" property set to HTTP.
This proc is:
Rules: parm( IN:FilesToDownloadId );
for each
&HttpResponse.AddHeader(!'Content-Type', FilesToDownloadFile.FileType)
&HttpResponse.AddHeader(!'Content-Disposition', !'attachment; filename=' + FilesToDownloadFile.FileName+"."+FilesToDownloadFile.FileType)
&blob=FilesToDownloadfile
&HttpResponse.AddFile(&Blob)
endfor
Vars:
&Blob - Blob
&ContentType - Varchar(40)
&HttpResponse - HTTPResponse

Related

Give a name to a pdf printed on screen in Genexus

With a Genexus procedure, setting the call protocol to Http and the output_file rule, you can create a report and show to the user a pdf, basic Genexus tool. My problem is that I can't set the name of this pdf, it ignores the parameter of the output_file rule and if I try to save the pdf manually, it's named as the name of the procedure.
Can I set the name of the pdf somehow? Better if I can send it as parameter
Add this code to the procedure.
// &DocumentFriendlyName is varchar(100)
&HttpResponse.AddHeader(!"Content-Type", !"application/pdf")
&HttpResponse.AddHeader(!"Content-Disposition", !"attachment;filename=" + &DocumentFriendlyName + !".pdf")
If you don't want to download the PDF directly, create the PDF on the server, then use a &Window object to show it.
&Window.Url = &DownloadPdfUrl
&Window.Open()
If you add the rule:
Output_file(&FileName, 'PDF');
It does not generate the file with the value of the variable &FileName?

Send an image from smart device to the server in Genexus

I know there is already a similar question but the answers to that didn't work for me
I'm working with Genexus 16U11 and I have a panel with an image variable (called &sourceImage) with control type as "SD Image Annotation". I need to send this image to the server, in a specific folder. According the documentation if I call a procedure using the image as variable this should go on the server but it's not working. I can't find the image anywhere, I searched also in the PublicTempStorage directory, in the procedure is as the variable is empty.
I tried also to convert the image in base64 to send it as longvarchar to the procedure
&blob = &sourceImage.GetAnnotatedImage()
&longvarchar = ToBase64(&blob)
but in this way I can only get this string ZmlsZTovLy8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uYXJ0ZWNoLnJpY2hpZXN0YXBlcm1lc3NpMTZ1MTEuc2Zpcm1hL2ZpbGVzL3RyYW5zZm9ybWF0aW9ucy8yMDIyLTAzLTE4LS0xNC00My0yNi02MTQ2NDcyMTA5MjM5NDU3NzgzODAxLnBuZw==
that is the path of the file
file:////storage/emulated/0/Android/data/com.artech.richiestapermessi16u11.sfirma/files/transformations/2022-03-18--14-43-26-6146472109239457783801.png
I tried with file variable, blob, image, extra images, method fromUrl, nothing is working.
What am I doing wrong?
To upload the image to the server you need to call the procedure in the server (Connectivity=Online).
Then the image variable will be send to the server and you can save, copy, etc. there.
For example, save in a Transaction with a code like this:
Call in the panel:
Composite
&resultImage = &ImageA.GetAnnotatedImage()
procSaveImage(&resultImage)
EndComposite
Procedure online:
&TrnData = new()
&TrnData.TrnDataImage = &parmImage
&TrnData.Insert()
if &TrnData.Success()
commit
Working in Genexus v17u8 .

TestComplete_JavaScripting_how to hide web url path while performing any operation for any object in script

I'm new to use Testcomplete , i'm using javascripts to automate my code, below are sample script ( converted one recorded first then converted into jscript) and in this scripts what i observe that TestComplete identified and captured the object element by using complete web url path not on only object specific .
efunction Test_Login {var UserName, Password, TestEnv;UserName = "XYZ";Pwd = "XYZXYZ";TestEnv = "https://test.Env.com/";Browsers.Item(btChrome).Run("TestEnv",1);Aliases.browser.pageTestenvCom.formFrmlogincomponent.textboxUsername.SetText("UserName");Aliases.browser.pageTestenvCom.formFrmlogincomponent.passwordboxPassword.SetText("Pwd");Aliases.browser.pageTestenvCom.formFrmlogincomponent.buttonLogin.ClickButton();}e
what i means lets see below example of login page
thank you
Whenever we record any Test case in Test-Complete, it stores all the object in the Naming Repository and then access the same.
This helps test-complete in easily recognisation of object and can improve the speed of test-case, in case there are multiple objects visible on screen
You can go through following link for more info on Name Mapping.
https://support.smartbear.com/testcomplete/docs/testing-with/object-identification/name-mapping/overview.html

Manually populate an ImageField

I have a models.ImageField which I sometimes populate with the corresponding forms.ImageField. Sometimes, instead of using a form, I want to update the image field with an ajax POST. I am passing both the image filename, and the image content (base64 encoded), so that in my api view I have everything I need. But I do not really know how to do this manually, since I have always relied in form processing, which automatically populates the models.ImageField.
How can I manually populate the models.ImageField having the filename and the file contents?
EDIT
I have reached the following status:
instance.image.save(file_name, File(StringIO(data)))
instance.save()
And this is updating the file reference, using the right value configured in upload_to in the ImageField.
But it is not saving the image. I would have imagined that the first .save call would:
Generate a file name in the configured storage
Save the file contents to the selected file, including handling of any kind of storage configured for this ImageField (local FS, Amazon S3, or whatever)
Update the reference to the file in the ImageField
And the second .save would actually save the updated instance to the database.
What am I doing wrong? How can I make sure that the new image content is actually written to disk, in the automatically generated file name?
EDIT2
I have a very unsatisfactory workaround, which is working but is very limited. This illustrates the problems that using the ImageField directly would solve:
# TODO: workaround because I do not yet know how to correctly populate the ImageField
# This is very limited because:
# - only uses local filesystem (no AWS S3, ...)
# - does not provide the advance splitting provided by upload_to
local_file = os.path.join(settings.MEDIA_ROOT, file_name)
with open(local_file, 'wb') as f:
f.write(data)
instance.image = file_name
instance.save()
EDIT3
So, after some more playing around I have discovered that my first implementation is doing the right thing, but silently failing if the passed data has the wrong format (I was mistakingly passing the base64 instead of the decoded data). I'll post this as a solution
Just save the file and the instance:
instance.image.save(file_name, File(StringIO(data)))
instance.save()
No idea where the docs for this usecase are.
You can use InMemoryUploadedFile directly to save data:
file = cStringIO.StringIO(base64.b64decode(request.POST['file']))
image = InMemoryUploadedFile(file,
field_name='file',
name=request.POST['name'],
content_type="image/jpeg",
size=sys.getsizeof(file),
charset=None)
instance.image = image
instance.save()

How do I correlate two identically coded variables sent in the response from a Worklight server response string in LoadRunner 12.02?

I am trying to create a load test versus one of our apps that is used on web and mobile. I am trying to access this app from the web. I login to the website. Using this login, I click on the web version of the app. The below response is returned here.
This app is using SiteMinder and Worklight to negotiate with the main site I am coming from.
My question is, how do I correlate a value such as 'SMIDENTITY=' when it is being returned TWICE in the same string?
Here is an example of what is being returned by the server (I have broken up the string so the variables are separated:
Test4.c(225):
Cookie:testcookie=oreo;
SMIDENTITY=Cq16kwJwrJWgBd5zQ8ci0kP8IEZ47kftOxMr1wVsxx+W/7sGS92ZA9zu69GRpolh0PRX97bvfHRya0m1ty1E07qR0HjKKXE8ypRsWPgG4m2w8mlspPUxL8t5Z4RE5/CCJpOxpXHIHeQK4f77gkihKFq8cBQr+Vy9kZGFGMUJH6+EiLNmmJT+XYZcUi7gzV0r+naJypMewtXAYaOcvn8Kqsu2JA5SiNUcJbxxX4dNCHOsC4cf45Jm0H40Efq6nOwN7MDyAE2gXSou4oa9ZlYxlsvWdEVl6CxgnqnqEkBJYVuBsgj/277+F7q9KB4xpct/sYvRT9CR/Rvh79hmpJJedH+lA8A6UtqyA21CnECQJzrbKJJgx3eeyN86BQv3g/kOWJ2CE4txEn22U+AjMKmxgB7fmLTNdxKS5+sn9P/Fs+TGwhRSX3pr/l1h4NQpNzb1Rz1fbt80/ODWbLSlBFBmQTCCRkLx54dcR40lH0iDl9543KZCAphpzKXS429ZZyCH00xdITd4vpab/l9cWZEHuoJFbgf4yWmx6eGo6zdPxb6Yv/D2EM9GnXnWsF14lrI4XtlreE+9o3EXSTbbz+MHh/ym/LzA4zaul4luiPMUNAnP+qatTR9WvK1NsC2KgsQl;
_ga=GA1.2.653519056.1433336304;
test_pol=UQEpK70TB9Ps6k9Zn0ZxC/WTTWAF7+1iJrMLhMAAA7SYUNDT9zue/krOWPgYi0yqdM6KUELeseH7xg==;
prismdc=prism1;
SMSESSION=CsYLjBNgLxl/cD1kJbxQdF2SAmFOE70rad51OQMLm1DQPcD2KYey2K05r4s8s9WFfEwLt2+wJweUR+MAf4Vq4v0ENDwm0ciXQ3jWEZheBbcugYPeUmAIPOIs21aBJxlPTCIXXpfmUhPFHOZnTEm7zsR1Hh9Y9gP9JB451iVsjRsojcwZGXwY3B7SqdMv2yDWnEebraDsiynDWadg63bIdoEvlPoVU0bPXbxKi5+F88PDB8S886UIWBfITiB8h2ETyNnKVFUm6l8Isyd68g8xwnExdbgBC4RYMhaeRulPKtYBKbMckwp6Wn0l125RGhqXayU7XLz7PvcsIqEZfxHFqD02kA0g6FNvBpCY1DY0TWn1FvnDNGyAzfDOclLIy78w1kDfL0FJ9G49LdJJJbpdmFkHSk1SCul8Hi5kvaxxntj8D4dEt/L4D1biLL+d6Wtzxqr+7qYS4SSY0ns/q2xOvmxJFulp+0cND2XZUDRH5LrSiVuQxZqa5hNJNfUkHRcNKveO5LJ/+bPPUyIWKplN1vTpS1/GoAZ88P3fAzVgNRBjrYZhOTJxRBAEAgd5CHAy1jjg+oH02xMZ1aPZ6TzKHU6QQFfrsgBqOjSPgMf/42MsyrO5TiXWSLgfttdCbReyF3j+jc/wA0a5UrVNtsqA3PTNvPtw+ctC8zwG73xHGOP+tMyupdIFhIwW5kvGMAKJWq4dsVq4QRGjd5kqUxIUDfN5TPcHHSzws4exH0F2VwxdmM3/VapwlwCvX5GOH78wGThIg6dxC2Ymib6nkB33wNbb4WlnZa23kkZYMjglBJj1HsTBMBF4mlkRwsWtRTXBlZSO7h34qjnDlkBI6FMeDO687pNaCo7a3QP7NkqLmwOps1CGgE1H3HRNHHbOu4trRlYdn2P1tBJLJFdf2vltWs75ZXi3duSIjAYqAz1DVqq2elqvREyP8+r34MQnSOKZG+fsTHGikOXuN8wAWOnohHJ2dYhvbXnQ7MnMlF0jac814HGzsWV74lH4zBijMMxh;
SMIDENTITY=Znq+Rjv7MGdt9xtb+8uGlTTdQZ9iYv6wGHXLdmFtwBycXLBJW8yDWKGSMWcsEzDS4HiatqOMOkvr6MrvozpzdChfri8omqI1NEQoNROSwOtyNzAkw+bz5JNKxvMYFCqPW/1PsUqFCG9TdOLxopxyza8JlCZIFs4XNmO0isgW7QwqCRYmGcwniMjfUMhrG87O6dU+/bOdxr6QrETp6QzLFxE/gdk1t4MqyUhdfWJA+BwRLQLj5DDasAYsRm0FegIbeqLgZDnLE9I+LbMpspcs/uAxngT7vLfvR+g7Ww9CpYbDx7KAernW7PzuzDuxwwKTr+ImolLUtc7eka1wl6wsdD7+jEDTnHda4wNVJjLoXldeAr6cJ2N1RF9UpjQkmDcaWTWU9v0ejB6/YZwKby8dRUuEH90BoSe+jicc/XHi5kq6w10P5r0/c0uZbgxrNAo8X+WW/QQUyOgsCVzila6z6Gef7zPgBw9lRjV5rYZlO97h3DEPgQoLNHLIummOdcJk84u9RfD68wk+3J2tbvKNj0O0ib5qapmJ3b7zXdmHW9KCHLz7MBMLl7tznaLyUoCSt+BQL8O/NfvpCmV6Rn5UEmeqLZXGaGzszc7oy+08WaGwGE7+dEEZmmC/httCy1bj;
LtpaToken2=D8P5upMb3r8v+VXraUoNZUCh08z0wKI466bDTnYEkrV9jS1Y6FOIYGyU18ETtFWxXBsyIizXZ2d9JmHTTFaBIpxhqHceufkDohe/dQoDPkiQgMmxGrX1IobPmb0tYgD2yrLh7TkxpBTt5nXn2isK2PVAk4a0zT/qa0g4huq457lH3CDLQF+jj8w9qB2/gSVlWXKX0SKHNd2YJ2mBrc4j7oBOE8GOXiJlH8B5qnKvX99aYIdKxXoNILDBfK/RFaGWIy34uLNVRjOkZcUkKCBVB0D83GIj2EM2YqFs+GuWnRKvW7woAGIN69j7T50NWoIF/TPmdCnCM1HEfxhHfqxK0u5PUKheZeKNXqepoNIEb5ry1QGBho0OAeXQvlYeXiPZfKknu66iJpPEQaIpj0csWThztytn7uDuAiTCPZ4Yhwm+6pYHhxp7Jx/U84L2u3M7BamqD+oiCrFaYpMXkCGHw99hbHhE1okP3q+Hb/TCODKwIG80lw7660Y+nFGMIaCreNeu0Em+dY7rTU+KubyJqeYtt/NssB1Qq945MShkhix+KDKE+ViNmmyRqyUQpTEx6fXgbJQihm7KguDfOJSxvsalaO3vAwwN/mJTSxcRVktIaAYT4ZcakZS5r/mLRVllQmOczO4Ex2zAgflcEZ3GUlG3+TuL6JCYVWI3haAa0wUWffLCYRPo/n2+4vl5v/x9HkTXIZe0p4JCS1nWpzZXsg==;
LtpaToken=EHYGd9YV18oZsd8vSkJGm6EitmZCspgF2RbWMb/kDol6urQ8ZBeespgw8VR0jXPkwKdnAQjJ5x4ZdmTexnZiL3QIVzdH+DwWbTNP4KBAe/cdizYf8/0w05B9N13YX4rT7xl/Y0ZUhZX1brNgM7zP19a4IjL0E0M5uK2qah9ggErQhovcziPkA6Uubd4ne5keV/H/S0ZdaRMSjhXp6njlRtJl6C2U5r91YTXYVnbnl+sgG88g9jnPa6+peg+yi4P9VeoSohydoAIrqBGbpr7yL9ocaO3dL6bq/Ff6WAWZuca1V+7+x4bxtWHQ2CgafibbAkowunOsCyHvCRbv2FH8MQ==;
JSESSIONID=0000QLn5MU6tB5uMM0bXlOC8ZYS:15b4l3mm8;
SITE_ENTRY_JUMPTO=polhome;
scoreboard="";
scoreboardReport="";
WLSESSIONID=0000Xr6ZS67VI4UH-HoycrnVBq1:18lm04lom\r\n
Use the Ordinal (or index) number of the instance of the variable which you need as part of your collection
See training material or online help for correlation functions related to ordinal value
You didn't say what you're actually trying to do. Do you need only use the most recent? only use the first?
You use a web_reg_save_param_ex to capture all Ordinals of a parameter. It puts it into an array.
You can then do what you want with that array.
You can also use a web_reg_save_param_regexp
I coped the code from the official documentation and put your variable name in there to make it easier for you.
web_reg_save_param_ex(
"ParamName=SMIDENTITY",
"LB/IC=SMIDENTITY=",
"RB/IC=;",
"Ordinal=all",
LAST);
web_submit_data("...");
/* Getting individual elements from a parameter array.
Since the parameter created by web_reg_save_param_ex
is called "SMIDENTITY", the number of elements
is saved in parameter "SMIDENTITY_count".
The array elements are parameters "SMIDENTITY_1",
"SMIDENTITY_2", ... "SMIDENTITY_n".
*/
elemCnt = atoi(lr_eval_string("{SMIDENTITY_count}"));
lr_output_message("Number of items found = %d",elemCnt);
for (x=1;x<=elemCnt;x++) {
sprintf(arrayParamName, "{SMIDENTITY_%d}", x);
lr_output_message ("%s: %s",
arrayParamName,
lr_eval_string(arrayParamName));
}

Resources