Wednesday, April 22, 2009

Upload a file to another webpage through a Java Servlet

In past few days, I had to work on implementing a functionality for sending an HTTP request to another url and upload a file with that HTTP request and then get the response for the HTTP request from a Java servlet. This is the code I finally created for achieving my task. It does,
  1. Connect to another given URL
  2. Upload given string as a file to the above url
  3. Then read the response for the above HTTP request.
Below function is called inside the protected void processRequest(HttpServletRequest request, HttpServletResponse response) of a Servlet in my project. I have put the relevant code for achieving this task in below.

// Import these packages
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

// Code
private String uploadFile(String urlstring, String dataXML) {
try {
 String itemname = "formFile"; String tempfilename = "test.xml";  String lineEnd = "\r\n";  String twoHyphens = "--";
 String boundary = "---------------------------24464570528145";
 URL url = new URL(urlstring);
 HttpURLConnection connection = (HttpURLConnection)  url.openConnection();
 connection.setDoOutput(true);
 connection.setDoInput(true);

 connection.setUseCaches(false);
 


 connection.setRequestMethod("POST");

 connection.setRequestProperty("Connection", "keep-alive"); 

 connection.setRequestProperty("Content-Type", "multipart/form- data; boundary=" + boundary);
 connection.setRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
 


 DataOutputStream dataoutputstream = new          

     DataOutputStream(connection.getOutputStream()); 

 dataoutputstream.writeBytes(twoHyphens + boundary + lineEnd);

 dataoutputstream.writeBytes("Content-Disposition: form-data;    name=\"" + itemname + "\"; filename=\"" + tempfilename + "\"" +  lineEnd);

 dataoutputstream.writeBytes("Content-Type: text/plain" +  lineEnd + lineEnd);
 // dataXML is File data, writes a string as the file content of  the uploading
 // file
 dataoutputstream.writeBytes(dataXML);
 dataoutputstream.writeBytes(lineEnd);

 dataoutputstream.writeBytes(twoHyphens + boundary + twoHyphens +
lineEnd);


 dataoutputstream.flush();
 dataoutputstream.close();

 String inputLine;
 StringBuffer sbResponseData = new StringBuffer();


 // Get the response data for the previous HTTP request

 DataInputStream dis = new  DataInputStream(connection.getInputStream());
 while ((inputLine = dis.readLine()) != null) {
  sbResponseData.append(inputLine + "\n");
 }

 dis.close();
 return sbResponseData.toString();


 }
 catch (Exception ex) {
  logger.error("Exception in initiating outdial call request:       Details: " + ex.toString());
 }

}

Wednesday, April 15, 2009

Previewing the URL of a TinyUrl

Nowadays, many of us use TinyURL s instead of using long urls for the ease of use. Think that a site you visited has a tiny url like http://tinyurl.com/c8yvgr. We can not directly say whether this tiny url links to a good site or a porn site or a other malicious site by looking at given tiny url . But now you can preview the actual URL before visiting the target site using a feature provided by http://tinyurl.com. What you have to do is go to http://tinyurl.com/preview.php and then click on the link Click here to enable previews. After enabling that, each time you click on a tinyURL, it will first show the preview of actual url and then you can proceed as you wish. You can later disable the preview settings using the same page.

Wednesday, April 8, 2009

How to get auto generated field values (primary keys etc) after inserting a data entry to the database [ for PostgreSQL]

In these days I'm involved with a project using a PostgreSQL database. This is the first time I'm working with PGSQL, So I could learn some new features in PGSQL. One of the requirement I needed while coding is to find an easy way to get the auto generated primary key value when inserting a data record to the PGSQL database. I could find several ways to do that and one of method I found was really easy way. Those methods I found are described in this post.

First Method:
public int insertData( String name, String address, String tp_no)
{

int insertedKey = 0;
try {
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/MyDb", "username", "password");

// Database has a primary key named "recordId"
String insertSql = "INSERT INTO \"MyTable\" (name, address, tp_no)" + " VALUES (?, ?, ?);";
PreparedStatement pstmt = con.prepareStatement(insertSql);
pstmt.setString(1, name);
pstmt.setString(2, address);
pstmt.setString(3, tp_no);
pstmt.executeUpdate();

// each table has a sequence named "TABLENAME_PRIMARYKEY_seq"
// my table name is "MyTable" and it has the auto incremented
// primary key field called "recordId". So sequence related to
// following query is "MyTable_recordId_seq"
String getRecordIdSql = "select currval('\"MyTable_recordId_seq\"');";
Statement stmtGetRecId = con.createStatement();
ResultSet res = stmtGetRecId.executeQuery(getRecordIdSql);

if (res.first())
{
insertedKey = res.getInt(1);
}

con.close();

}
catch (Exception e)
{
System.out.println("Exception occurred: Details: " + e.getLocalizedMessage());
}

return insertedKey;

}

Second & Easy Method:

public int insertData( String name, String address, String tp_no)
{

int insertedKey = 0;
try {
Class.forName("org.postgresql.Driver");
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/MyDb", "username", "password");
// See the end of the query string
// Database has a primary key named "recordId"
String insertSql = "INSERT INTO \"MyTable\" (name, address, tp_no)" + " VALUES (?, ?, ?) RETURNING recordId;";
PreparedStatement pstmt = con.prepareStatement(insertSql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
pstmt.setString(1, name);
pstmt.setString(2, address);
pstmt.setString(3, tp_no);
ResultSet res = pstmt.executeQuery();
// Get record id of the newly inserted record
if (res.first()) {
insertedKey = res.getInt(1);
}
res.close();
con.close();
} catch (Exception e) {
// logging
System.out.println("Exception occurred: Details: " + e.getLocalizedMessage());
}
return insertedKey;

}

Another Method:
I found later an another way to get the generated keys using JDBC, but I didn't have time to test that. But you can find an example to that method in this article http://www.java-tips.org/other-api-tips/jdbc/how-to-get-auto-generated-keys-from-java-class-3.html

Wednesday, April 1, 2009

Show hidden files even when computer is infected by a virus

You can show the hidden files by changing this entry even in a machine infected by a virus. There is another place in the registry that can use to show/hide hidden files, but when the computer is infected by a virus, it doesn't work. This method still works in this situation.
+HKEY_LOCAL_MACHINE
+SOFTWARE
+Microsoft
+Windows
+CurrentVersion
+Explorer
+Advanced
+Folder
+Hidden
NOHIDDEN
In the NOHIDDEN folder, select CheckedValue and set value to 1.