Save Image from url without getting corrupted in flask application
up vote
-1
down vote
favorite
I'm trying to download image from the url with in the flask application.I'm sending image url as argument to the flask api.
In order to download the image I tried out requests, urllib.request python packages with flask and able to download the image file but image is downloaded corrupted(HTML content is seen inside the file if i remove the jpg extension of saved image).When I tried the open the image its shown as

But when I use requests or urllib.request as normal python code I'm able to download the image with getting corrupted.

html content inside the saved image file
<html lang="en-IN"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Redirect Notice</title><style>body,div,a{font-family:arial,sans-serif}body{background-color:#fff;margin-top:3px}div{color:#000}a:link{color:#00c}a:visited{color:#551a8b}a:active{color:red}div.mymGo{border-top:1px solid #bbb;border-bottom:1px solid #bbb;background:#f2f2f2;margin-top:1em;width:100%}div.aXgaGb{padding:0.5em 0;margin-left:10px}div.fTk7vd{margin-left:35px;margin-top:35px}</style><script nonce="XR9ZVDq/iEK0A9IJNd53Cw==">function go_back(){window.history.go(-1);return false;}function ctu(oi,ct){var link = document && document.referrer;var esc_link = "";var e = window && window.encodeURIComponent ?encodeURIComponent :escape;if (link){esc_link = e(link);}new Image().src = "/url?sa=T&url=" + esc_link + "&oi=" + e(oi)+ "&ct=" + e(ct);return false;}</script></head><body><div class="mymGo"><div class="aXgaGb"><font style="font-size:larger"><b>Redirect Notice</b></font></div></div><div class="fTk7vd"> The page you were on is trying to send you to an invalid URL.<br><br> If you do not want to visit that page, you can <a href="#" onclick="return go_back();" onmousedown="ctu('unauthorizedredirect','originlink');">return to the previous page</a>.<br><br><br></div></body></html>
&
HTML Content says that URL is invalid.
Normal python
import urllib.request
urllib.request.urlretrieve("data:image/jpeg;base64,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","/home/local/down.jpg")
Flask view.py code :
This code is able to download the image but the image is corrupted
@app.route("/url", methods=["GET"])
def image_download():
if 'img' in request.args:
Input_url=request.args['img']
file_name="/home/local/down.jpg"
urllib.request.urlretrieve(Input_url,file_name)
I tried the changing the file extension also but no use.
I'm unable to trace out why image is getting corrupted when I'm trying to download using flask.
you help is appreciated and thanks in advance.
python-3.x image flask flask-restful
|
show 2 more comments
up vote
-1
down vote
favorite
I'm trying to download image from the url with in the flask application.I'm sending image url as argument to the flask api.
In order to download the image I tried out requests, urllib.request python packages with flask and able to download the image file but image is downloaded corrupted(HTML content is seen inside the file if i remove the jpg extension of saved image).When I tried the open the image its shown as

But when I use requests or urllib.request as normal python code I'm able to download the image with getting corrupted.

html content inside the saved image file
<html lang="en-IN"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Redirect Notice</title><style>body,div,a{font-family:arial,sans-serif}body{background-color:#fff;margin-top:3px}div{color:#000}a:link{color:#00c}a:visited{color:#551a8b}a:active{color:red}div.mymGo{border-top:1px solid #bbb;border-bottom:1px solid #bbb;background:#f2f2f2;margin-top:1em;width:100%}div.aXgaGb{padding:0.5em 0;margin-left:10px}div.fTk7vd{margin-left:35px;margin-top:35px}</style><script nonce="XR9ZVDq/iEK0A9IJNd53Cw==">function go_back(){window.history.go(-1);return false;}function ctu(oi,ct){var link = document && document.referrer;var esc_link = "";var e = window && window.encodeURIComponent ?encodeURIComponent :escape;if (link){esc_link = e(link);}new Image().src = "/url?sa=T&url=" + esc_link + "&oi=" + e(oi)+ "&ct=" + e(ct);return false;}</script></head><body><div class="mymGo"><div class="aXgaGb"><font style="font-size:larger"><b>Redirect Notice</b></font></div></div><div class="fTk7vd"> The page you were on is trying to send you to an invalid URL.<br><br> If you do not want to visit that page, you can <a href="#" onclick="return go_back();" onmousedown="ctu('unauthorizedredirect','originlink');">return to the previous page</a>.<br><br><br></div></body></html>
&
HTML Content says that URL is invalid.
Normal python
import urllib.request
urllib.request.urlretrieve("data:image/jpeg;base64,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","/home/local/down.jpg")
Flask view.py code :
This code is able to download the image but the image is corrupted
@app.route("/url", methods=["GET"])
def image_download():
if 'img' in request.args:
Input_url=request.args['img']
file_name="/home/local/down.jpg"
urllib.request.urlretrieve(Input_url,file_name)
I tried the changing the file extension also but no use.
I'm unable to trace out why image is getting corrupted when I'm trying to download using flask.
you help is appreciated and thanks in advance.
python-3.x image flask flask-restful
0x3C,0X68is the ascii code for<h. You're probably getting HTML. Try to save the "image" and see what's in the file.
– Jean-François Fabre
3 hours ago
1
then you could usespyder(sorry, couldn't resist :))
– Jean-François Fabre
3 hours ago
I'm already saving it as jpg file (down.jpg) ! if that is wrong way to save the image then I how to save image in image format
– Dilip Bobby
3 hours ago
I mean:down.jpgcontains html. Check the ASCII codes of the error, and my first comment.
– Jean-François Fabre
3 hours ago
yup, if I remove the jpg then the file is full of html text. I using urllib.request.urlretrieve(Input_url,file_name) same python code which save correct image but it is giving me html if put that line in flask view.py
– Dilip Bobby
3 hours ago
|
show 2 more comments
up vote
-1
down vote
favorite
up vote
-1
down vote
favorite
I'm trying to download image from the url with in the flask application.I'm sending image url as argument to the flask api.
In order to download the image I tried out requests, urllib.request python packages with flask and able to download the image file but image is downloaded corrupted(HTML content is seen inside the file if i remove the jpg extension of saved image).When I tried the open the image its shown as

But when I use requests or urllib.request as normal python code I'm able to download the image with getting corrupted.

html content inside the saved image file
<html lang="en-IN"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Redirect Notice</title><style>body,div,a{font-family:arial,sans-serif}body{background-color:#fff;margin-top:3px}div{color:#000}a:link{color:#00c}a:visited{color:#551a8b}a:active{color:red}div.mymGo{border-top:1px solid #bbb;border-bottom:1px solid #bbb;background:#f2f2f2;margin-top:1em;width:100%}div.aXgaGb{padding:0.5em 0;margin-left:10px}div.fTk7vd{margin-left:35px;margin-top:35px}</style><script nonce="XR9ZVDq/iEK0A9IJNd53Cw==">function go_back(){window.history.go(-1);return false;}function ctu(oi,ct){var link = document && document.referrer;var esc_link = "";var e = window && window.encodeURIComponent ?encodeURIComponent :escape;if (link){esc_link = e(link);}new Image().src = "/url?sa=T&url=" + esc_link + "&oi=" + e(oi)+ "&ct=" + e(ct);return false;}</script></head><body><div class="mymGo"><div class="aXgaGb"><font style="font-size:larger"><b>Redirect Notice</b></font></div></div><div class="fTk7vd"> The page you were on is trying to send you to an invalid URL.<br><br> If you do not want to visit that page, you can <a href="#" onclick="return go_back();" onmousedown="ctu('unauthorizedredirect','originlink');">return to the previous page</a>.<br><br><br></div></body></html>
&
HTML Content says that URL is invalid.
Normal python
import urllib.request
urllib.request.urlretrieve("data:image/jpeg;base64,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","/home/local/down.jpg")
Flask view.py code :
This code is able to download the image but the image is corrupted
@app.route("/url", methods=["GET"])
def image_download():
if 'img' in request.args:
Input_url=request.args['img']
file_name="/home/local/down.jpg"
urllib.request.urlretrieve(Input_url,file_name)
I tried the changing the file extension also but no use.
I'm unable to trace out why image is getting corrupted when I'm trying to download using flask.
you help is appreciated and thanks in advance.
python-3.x image flask flask-restful
I'm trying to download image from the url with in the flask application.I'm sending image url as argument to the flask api.
In order to download the image I tried out requests, urllib.request python packages with flask and able to download the image file but image is downloaded corrupted(HTML content is seen inside the file if i remove the jpg extension of saved image).When I tried the open the image its shown as

But when I use requests or urllib.request as normal python code I'm able to download the image with getting corrupted.

html content inside the saved image file
<html lang="en-IN"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Redirect Notice</title><style>body,div,a{font-family:arial,sans-serif}body{background-color:#fff;margin-top:3px}div{color:#000}a:link{color:#00c}a:visited{color:#551a8b}a:active{color:red}div.mymGo{border-top:1px solid #bbb;border-bottom:1px solid #bbb;background:#f2f2f2;margin-top:1em;width:100%}div.aXgaGb{padding:0.5em 0;margin-left:10px}div.fTk7vd{margin-left:35px;margin-top:35px}</style><script nonce="XR9ZVDq/iEK0A9IJNd53Cw==">function go_back(){window.history.go(-1);return false;}function ctu(oi,ct){var link = document && document.referrer;var esc_link = "";var e = window && window.encodeURIComponent ?encodeURIComponent :escape;if (link){esc_link = e(link);}new Image().src = "/url?sa=T&url=" + esc_link + "&oi=" + e(oi)+ "&ct=" + e(ct);return false;}</script></head><body><div class="mymGo"><div class="aXgaGb"><font style="font-size:larger"><b>Redirect Notice</b></font></div></div><div class="fTk7vd"> The page you were on is trying to send you to an invalid URL.<br><br> If you do not want to visit that page, you can <a href="#" onclick="return go_back();" onmousedown="ctu('unauthorizedredirect','originlink');">return to the previous page</a>.<br><br><br></div></body></html>
&
HTML Content says that URL is invalid.
Normal python
import urllib.request
urllib.request.urlretrieve("data:image/jpeg;base64,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","/home/local/down.jpg")
Flask view.py code :
This code is able to download the image but the image is corrupted
@app.route("/url", methods=["GET"])
def image_download():
if 'img' in request.args:
Input_url=request.args['img']
file_name="/home/local/down.jpg"
urllib.request.urlretrieve(Input_url,file_name)
I tried the changing the file extension also but no use.
I'm unable to trace out why image is getting corrupted when I'm trying to download using flask.
you help is appreciated and thanks in advance.
python-3.x image flask flask-restful
python-3.x image flask flask-restful
edited 2 hours ago
asked 3 hours ago
Dilip Bobby
161314
161314
0x3C,0X68is the ascii code for<h. You're probably getting HTML. Try to save the "image" and see what's in the file.
– Jean-François Fabre
3 hours ago
1
then you could usespyder(sorry, couldn't resist :))
– Jean-François Fabre
3 hours ago
I'm already saving it as jpg file (down.jpg) ! if that is wrong way to save the image then I how to save image in image format
– Dilip Bobby
3 hours ago
I mean:down.jpgcontains html. Check the ASCII codes of the error, and my first comment.
– Jean-François Fabre
3 hours ago
yup, if I remove the jpg then the file is full of html text. I using urllib.request.urlretrieve(Input_url,file_name) same python code which save correct image but it is giving me html if put that line in flask view.py
– Dilip Bobby
3 hours ago
|
show 2 more comments
0x3C,0X68is the ascii code for<h. You're probably getting HTML. Try to save the "image" and see what's in the file.
– Jean-François Fabre
3 hours ago
1
then you could usespyder(sorry, couldn't resist :))
– Jean-François Fabre
3 hours ago
I'm already saving it as jpg file (down.jpg) ! if that is wrong way to save the image then I how to save image in image format
– Dilip Bobby
3 hours ago
I mean:down.jpgcontains html. Check the ASCII codes of the error, and my first comment.
– Jean-François Fabre
3 hours ago
yup, if I remove the jpg then the file is full of html text. I using urllib.request.urlretrieve(Input_url,file_name) same python code which save correct image but it is giving me html if put that line in flask view.py
– Dilip Bobby
3 hours ago
0x3C,0X68 is the ascii code for <h. You're probably getting HTML. Try to save the "image" and see what's in the file.– Jean-François Fabre
3 hours ago
0x3C,0X68 is the ascii code for <h. You're probably getting HTML. Try to save the "image" and see what's in the file.– Jean-François Fabre
3 hours ago
1
1
then you could use
spyder (sorry, couldn't resist :))– Jean-François Fabre
3 hours ago
then you could use
spyder (sorry, couldn't resist :))– Jean-François Fabre
3 hours ago
I'm already saving it as jpg file (down.jpg) ! if that is wrong way to save the image then I how to save image in image format
– Dilip Bobby
3 hours ago
I'm already saving it as jpg file (down.jpg) ! if that is wrong way to save the image then I how to save image in image format
– Dilip Bobby
3 hours ago
I mean:
down.jpg contains html. Check the ASCII codes of the error, and my first comment.– Jean-François Fabre
3 hours ago
I mean:
down.jpg contains html. Check the ASCII codes of the error, and my first comment.– Jean-François Fabre
3 hours ago
yup, if I remove the jpg then the file is full of html text. I using urllib.request.urlretrieve(Input_url,file_name) same python code which save correct image but it is giving me html if put that line in flask view.py
– Dilip Bobby
3 hours ago
yup, if I remove the jpg then the file is full of html text. I using urllib.request.urlretrieve(Input_url,file_name) same python code which save correct image but it is giving me html if put that line in flask view.py
– Dilip Bobby
3 hours ago
|
show 2 more comments
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53400791%2fsave-image-from-url-without-getting-corrupted-in-flask-application%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
0x3C,0X68is the ascii code for<h. You're probably getting HTML. Try to save the "image" and see what's in the file.– Jean-François Fabre
3 hours ago
1
then you could use
spyder(sorry, couldn't resist :))– Jean-François Fabre
3 hours ago
I'm already saving it as jpg file (down.jpg) ! if that is wrong way to save the image then I how to save image in image format
– Dilip Bobby
3 hours ago
I mean:
down.jpgcontains html. Check the ASCII codes of the error, and my first comment.– Jean-François Fabre
3 hours ago
yup, if I remove the jpg then the file is full of html text. I using urllib.request.urlretrieve(Input_url,file_name) same python code which save correct image but it is giving me html if put that line in flask view.py
– Dilip Bobby
3 hours ago