I am searching for a solution that will allow a user to upload an image, crop the image, and then send the updated image to the server.
Basically, I would like to handle all the editing client side and only send the new, smaller, thumbnail to the server.
How can I do this? I have seen this is possible with Flash, but I am looking for alternative solutions.
Are you restricted to certain browsers? Using HTML5, here is a proof of concept from Anand Venkataraman. Demo is here.
Related
I've got this email today with a big image displayed on it and with no option to hide the images on that email: http://clip2net.com/s/1xo7u
By default Gmail does not display images from unknown senders, and always display options to display or hide the images from the email. Who did these guys bypassed Gmail's image filter?
Is there a known way to force your images to be displayed when sending newsletters?
Before you close my question as off-topic, please let me argue that this is a programming related issue because automated newsletters are a very common requirement in web programming projects, and myths of people (spammers) being able to force images to display are to be confronted frequently by software developers.
I'm pretty sure that at present (this may change) that as long as the image is embedded into the mime message and is marked as inline Google Mail will display in the message. This may or may not apply to different mail clients.
We do this when we send out status emails to include the icons that we display within a table in the email content. If the images are not referenced by the message content then the images appear as attachments. However, if the images are referenced then they're not listed as attachments and are displayed inline.
Inline images don't pose a threat from spammers because they're not making a call to an external server and are therefore not trackable. You can do this in your app by setting the attachment mime headers (content disposition and content-ID) such as:
Content-Disposition: inline;
filename=image.png
Content-ID: <4f22bc6ab05be_17a1dcc610ac#b456a124-73ac-499f-932e-7f76089dbbb4.mail>
and then reference it using:
<img src="cid:4f22bc6ab05be_17a1dcc610ac#b456a124-73ac-499f-932e-7f76089dbbb4.mail" />
This is not possible, you can never force the client to do so. Since those are security measures the developers of the e-mail applications will not allows you to override the usersettings.
Make the image into ascii art :-)
Google provides an excellent way to resize images dynamically; simply append =sXX to the image URL. This is perfect if you want to shrink an image, but if the image is smaller than the size specified, it enlarges it, giving it a pixelated effect.
Is there an easy way to say "don't enlarge, only shrink" when using serving URLs with a specified size?
UPDATE
This functionality is now a feature request at GAE. Vote it up if you'd like to see it!
As stated in my comments above, this isn't possible.
Although I have no use of the image framework I can see how your request would be useful. May I suggest posting a Feature Request on the Google App Engines Issues BB?
After posting the request, update your StackOverflow question with a link to your Feature Request so that other users can +1 the request.
Here's the link to the GAE Issues Page. Although this is not a bug, you will need to click the New Issue button to request a feature.
What you could do is store the size of the image in the datastore so when you need the image to be a certain size, you can check in the datastore to see what size it is and add the =sXX accordingly.
I am a complete novice to Flash (never created anything in flash). I am quite familiar with web applications (J2EE based) and have a reasonable expertise in Javascript.
Here is my requirement.
I want the user to select (via an html form) an image. Normally in the post, this image would be sent to server and may be stored there to be served later. I do not want that. I want to store this image locally and then serve it via HTTP to the user.
So, the flow is:
1. Go to the "select image url":mywebsite.com/selectImage
Browse the image and select the image
This would transfer control locally to some code running on the client (Javascript or flash), which would then store the image locally at some place on the client machine.
Go to the "show image url": mywebsite.com/showImage
This would eventually result in some client code running on the browser that retrieves the image and renders it (without any server round trips.)
I considered the following options:
Use HTML5 local storage. Since I am a complete novice to flash, I looked into this. I found that it is fairly straightforward to store and retrieve images in javascript (only strings are allowed but I am hoping storing base64 encoded strings would work at least for small images). However, how do I serve the image via http url that points to my server without a server round trip? I saw the interesting article at http://hacks.mozilla.org/category/fileapi/ but that would work only in firefox and I need to work on all latest browsers (at least the ones supporting HTML5 local storage)
Use flash SharedObjects. OK, this would have been good - the only thing is I am not sure where to start. Snippets of actionscripts to do this are scattered everywhere but I do not know how to use those scripts in an actual html page:) I do not need to create any movies or anything - just need to store an image and serve it locally. If I go this route, I would also use it to store other "strings" locally. If you suggest this, please give me the exact steps (could be pointers to other web sites) on how to do this. I would like to avoid paying for any flash development environment software ideally:)
Thank you!
You could use a data URI to display the file. Essentially you use the image data (plus a prefix) as the src attribute of an image element. If you already figured out how to read the file into memory as a base64 encoded string, using a data URI would probably be the easiest way to display the image.
OK
I was able to implement the following solution (just in case anyone has any comments or would like to know the answer)
wrote server side code that takes an image and returns its base 64 encoded version.
used the hidden iframe trick to get the base 64 encoded data into an iframe and stored it into the image by dynamically changing the image source to the data uri
For the "hidden iframe trick" - in case you are interested, there is a good article at (see www.openjs.com/articles/ajax/ajax_file_upload/response_data.php)
The only limitation is that IE does not work with images whose base 64 encoded string exceeds 32K - see http://msdn.microsoft.com/en-us/ie/dd578309.aspx. Note that only IE 8 works - IE 7 does not support data uri I believe.
I've got an app on Google App Engine that will accept image uploads from users. The problem that I envision is that users will upload these images directly from their cameras, and file sizes are often greater than 1MB, which is the limit for the image API (which would be used to resize the images).
What's the best way to accept the upload of say a 1.5MB image file, and resize it to under 1MB?
While this is not clear in the App Engine documentation, this is possible by using a combination of the Blobstore and the Image Manipulation Service.
You must:
Upload the Image into the Blobstore
Retrieve the Image from the Blobstore
Perform the Image Manipulation with an Image resulting in less than 1mb in size
I've written up a post about this -> http://socialappdev.com/uploading-and-re-sizing-large-images-on-app-engine-11-2010.
Here are two (similar) ways to solve this:
If you want to keep everything controlled yourself, you can put a resize script on a server of yours, which takes the URL to the raw uploaded image (which can be up to 10MB due to HTTP response size limit, but you would have to store it as 1MB chunks in the datastore), downloads it from your application, resizes it, and then POSTs it back to your application. All this interaction would need some kind of authorization of course, so that it can't be abused. Alternatively, POST the image directly to your external server, but then you have to either send the other form data back to your application, or use a separate form for the image upload.
Use an external imaging service. I would recommend Picnik. See their API documentation. As you can see, it lets you make a form that posts the image directly to their servers, then the user can edit the image (and resize), then the image is posted back to your server. With this solution you have to upload the image in a separate form, since Picnik receives all your POST data.
I recommend point 2, because it doesn't require you to go around Google App Engine limitations and since your users are uploading images straight from the camera, they will probably want to do something with them anyways (such as crop.)
That's a conundrum. The "obvious" answer, using google.appengine.api.images.resize, won't work because it's too big. :) So you will have to use third-party software, either on the server (which will be tricky because of App Engine's limitations) or the cilent (e.g. a Java uploader).
I need to understand a good way to design a web page with dynamically updated graphs. It should be something close to what stock market graphs look like (e.g. Google Finance), although with a bit more complicated functionality, which is not the point. Naturally I am thinking of writing an ajaxy-style flash control, which would communicate with the server through, okay, something like XMLHttpRequest, but from within flash code, and draw things basing on data received. Is this doable with flash? Does security model allow such kind of client-server interaction? If yes, could you think of any references for me to get started (similar opensource projects, articles, whatever)? Or should I forget about flash and use a Java applet right away?
An important thing to note: I don't think I can use Google charting API, because I need also to have user interaction. In the link above to Google Finance the user can drag the graph to and forth with the mouse, that's close to what I need (I will also need to implement some actions from the dropdown menu).
Thanks for your answers and opinions!
Try this: JQuery Flot
Flot is a JQuery plugin to plot graphs. You keep replotting in-place with the latest data at the desired frequency to generate a dynamically updated graph. It is based on the <canvas> tag. We use it successfully to generate pretty complex dynamically updated graphs in our applications. The updates are fetched via periodic AJAX calls.
Another alternative is YUI Charts
We did not explore this a lot but this uses Flash and AJAX like you wanted to do.
/RS
I have used the Google Charts API to do this sort of thing. For a simple example, see my Sunrise and Sunset page. This page calculates sunrise and sunset times for a given latitude and longitude, all in Javascript, then uses the Google Chart API to replace the graph on the page with the requested data.
Update: The Stack Overflow reputation graph (see your user page) isn't Flash and yet allows interactive dragging. (Click and drag on the left to update the posts on the right that reflect the highlighted reputation region.) Perhaps you could look at how that is implemented.
You have described Flex...
This is very possible in flash.
You can use the URLLoader class to obtain data from a server at run time and the draw your graph using a custom control. In actionscript3 you'd subclass the Shape class and write a little drawing code to draw your graphs. Flash has support for drawing and filling so it would probably be very good at this.
The flash client can poll the server for updates. Or if you want a "live" connection you can establish a socket connection to the server and let the server push updated data live. Flash is good for this as you can push XML data over the socket and use the built in support for processing the XML, or you can send binary data just as easily.
As for the security model it's just the standard flash one. You can make network connections back to the server that the swf file came from with no issues. If you want to make a connection to a different server then that server needs to give your client permission to connect to it by hosting a crossdomain.xml file
I'm not sure about the Flash side of things, but this would be pretty simple to do in Silverlight. I am pretty sure you'd easily be able to make a server request in Flash too.
I'd do some searching for long polling.