Use flex and Java Servlets to upload files to the red5 Server
Sample resources in this article
This article uses a demo to demonstrate how to use flex and Java Servlets to upload a local file of any type to the red5 server. The flex filereference interface is used to upload and download files on the remote server. The filereference class provides a dialog box interface and an upload method. In this dialog box, select a local file. The upload method calls PHP, ASP, or Java code on the remote server to upload files.
First, create a flex3 application that obtains the local file and calls the servlet of the red5 server "http: // localhost: 5080/red5fileuploadproj/fileupload.
The source code of uploadtored5proj. mxml is as follows:
<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:net="flash.net.*" layout="absolute" creationComplete="doInit()"> <mx:Panel horizontalCenter="0" verticalCenter="0" verticalAlign="middle" horizontalAlign="center" borderColor="#FFFFFF" width="100%" height="100%" backgroundColor="#307CB7"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection;import mx.controls.Alert;[Bindable]private var fileReference:FileReference;[Bindable]private var fileSelected:Boolean = false;[Bindable]private var serverUrl:String = "http://localhost:5080/Red5FileUploadProj/fileupload";private var statusArray:Array = new Array(); [Bindable]private var statusArrayCollection:ArrayCollection = new ArrayCollection(); private function doInit():void{ fileReference = new FileReference(); fileReference.addEventListener(Event.SELECT, onFileSelect); fileReference.addEventListener(Event.COMPLETE, onUploadComplete); fileReference.addEventListener(ProgressEvent.PROGRESS,onUploadProgress); fileReference.addEventListener(IOErrorEvent.IO_ERROR, onUploadError); fileReference.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onUploadError);}private function browseFile(event:MouseEvent):void{ fileReference.browse();}private function onFileSelect(event:Event):void{ fileSelected = true; fileTxt.text = fileReference.name; statusArray.push({status:"Ready to upload "+fileTxt.text}); statusArrayCollection = new ArrayCollection(statusArray);}private function uploadFile(event:MouseEvent):void{ if (!fileSelected || (urlTxt.text.length == 0)) { Alert.show("Select a file and Enter a URL"); return; } var urlRequest:URLRequest = new URLRequest(urlTxt.text); fileReference.upload(urlRequest);}private function onUploadProgress(event:ProgressEvent):void{ statusArray.push({status:"In progress.."+((event.bytesLoaded * 100) / event.bytesTotal).toString()+"%"}); statusArrayCollection = new ArrayCollection(statusArray);}private function onUploadComplete(event:Event):void{ statusArray.push({status:"Uploaded successfully!"}); statusArrayCollection = new ArrayCollection(statusArray);}private function onUploadError(event:Event):void{ if (event is IOErrorEvent) { statusArray.push({status:"IO Error: "+(event as IOErrorEvent).text.toString()}); statusArrayCollection = new ArrayCollection(statusArray); } else if (event is SecurityErrorEvent) { statusArray.push({status:"Security Error: "+(event as IOErrorEvent).text.toString()}); statusArrayCollection = new ArrayCollection(statusArray); }} ]]> </mx:Script> <mx:VBox height="40%" width="30%" horizontalGap="0" horizontalAlign="left"> <mx:HBox height="10%" width="100%" horizontalAlign="left"> <mx:VBox height="100%" width="30%" horizontalAlign="left"> <mx:Label text="File name"></mx:Label> </mx:VBox> <mx:VBox height="100%" width="40%" horizontalAlign="left"> <mx:TextInput id="fileTxt" width="200" editable="false" toolTip="Select File to upload"/></mx:VBox><mx:VBox height="100%" width="30%" horizontalAlign="left"> <mx:Button id="browseBut" label="Browse" click="browseFile(event)" /></mx:VBox> </mx:HBox> <mx:HBox height="10%" width="100%" horizontalAlign="left"> <mx:VBox height="100%" width="30%" horizontalAlign="left"> <mx:Label text="Server URL"></mx:Label> </mx:VBox><mx:VBox height="100%" width="70%" horizontalAlign="left"> <mx:TextInput id="urlTxt" width="290" text="{serverUrl}"/></mx:VBox> </mx:HBox> <mx:HBox height="10%" width="100%" horizontalAlign="center"> <mx:Button id="uploadBut" label="Upload file" click="uploadFile(event)" enabled="{fileSelected}" /> </mx:HBox> <mx:HBox height="70%" width="100%" horizontalAlign="center"> <mx:DataGrid id="statusDG" width="100%" height="100%" dataProvider="{statusArrayCollection}" variableRowHeight="true" wordWrap="true"> <mx:columns> <mx:DataGridColumn dataField="status" headerText="Upload Status" paddingLeft="0" paddingRight="0"> </mx:DataGridColumn> </mx:columns> </mx:DataGrid> </mx:HBox> </mx:VBox> </mx:Panel></mx:Application>
The server-side Java Servlet Code uses an Apache third-party class library commons fileupload package, which enables our servlets or web applications to have the upload function. You can download this package from here: http://commons.apache.org/fileupload /. The commons fileupload package uses Apache internally.
Commons Io package, so we can also download this package: http://commons.apache.org/io /. In the example of this article, I am using commons-fileupload-1.2.1.jar and commons-io-1.4.jar. Copy commons-fileupload-1.2.1.jar, commons-io-1.4.jar, and servlet-api.jar to red5
Under the/WEB-INF/lib directory of the project. The servlet-api.jar can go to the Lib folder under the tomcat installation directory to find.
Then, add the following content to the Web. xml folder of our red5 application:
<servlet> <servlet-name>fileupload</servlet-name> <servlet-class>com.mycompany.ind.red5.FileUploadServlet</servlet-class> <init-param> <param-name>uploadFolder</param-name> <param-value>uploads</param-value> </init-param></servlet><servlet-mapping> <servlet-name>fileupload</servlet-name> <url-pattern>/fileupload</url-pattern></servlet-mapping>
If you are familiar with Jee, you will find the web with Tomcat. xml configuration is basically consistent: the servlet-mapping element will match the/fileupload URL to the servlet named "fileupload", and the servlet element will indicate the specific implementation class of the servlet; the uploaded folder name is also defined here as the initial servlet parameter. It is defined as "uploads", so we should create a folder with the same name under the root directory of our red5 project.
Finally, write the fileuploadservlet class for specific uploads:
package com.mycompany.ind.red5;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.FileItemFactory;import org.apache.commons.fileupload.FileUploadException;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;import java.io.IOException;import java.util.Iterator;import java.util.List;import java.io.FileOutputStream;import java.io.FileNotFoundException;public class FileUploadServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { super.doGet(request, response); doPost(request,response); } @Override public void doPost( HttpServletRequest request, HttpServletResponse response ) { /** * Create a factory for new disk-based file items */ FileItemFactory factory = new DiskFileItemFactory(); /** * Create a new file upload handler */ ServletFileUpload upload = new ServletFileUpload(factory); try { /** * Parsing input request */ List items = upload.parseRequest(request); /** * Process the uploaded items */ Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); /** * handling a normal form-field */ if (item.isFormField()) { System.out.println("A form field"); } else { /** * handling file uploads */ System.out.println("Not a form field"); String uploadFileName = item.getName(); byte[] data = item.get(); /** * Gets directory to which the file is to be uploaded */ String uploadFolder = getServletConfig().getInitParameter("uploadFolder"); String fileFolderName = getServletContext().getRealPath(uploadFolder + "\\"+uploadFileName); try { FileOutputStream fileOutSt = new FileOutputStream(fileFolderName); try { fileOutSt.write(data); fileOutSt.close(); } catch(IOException exception) { exception.printStackTrace(); } } catch(FileNotFoundException exception) { exception.printStackTrace(); }} } } catch(FileUploadException exception) { exception.printStackTrace(); } }}
If you have any questions, please contact us online. MSN: defonds # hotmail.com; email: defonds # 163.com( #= @).
Original blog address: http://tharas.wordpress.com/2009/12/20/upload-files-to-red5-server /.