package upload;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.InitialContext;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.DataSource;
public class uploadAction extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {response.setContentType(CONTENT_TYPE);
byte[] image=null;
//载取上传文件内容
parseFileForm parse=new parseFileForm();
image=parse.parseOneField(request);
try{
InitialContext ic=new InitialContext();
DataSource ds=(DataSource)ic.lookup("jdbc/localDS");
Connection conn=ds.getConnection();
//Blob操作的第一步:插入一个空Blob字段
PreparedStatement ps=conn.prepareStatement("insert into filetable (filename,filecnt,filetype) values (?,empty_blob(),?)");
ps.setString(1,"test8");
ps.setString(2,"JPEG");
ps.executeUpdate();
ps.close();
//Blob操作的第二步:取出数据库表中的Blob字段。
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select filecnt from filetable where filename='test8' for update");
rs.next();
Blob blob=rs.getBlob("filecnt");
//Blob更新操作:设置输出流。
OutputStream os=blob.setBinaryStream(0);
//Blob更新操作:通过输出流写入内容。
os.write(image);
os.close();
ps=conn.prepareStatement("update filetable set filecnt=? where filename='test8'");
ps.setBlob(1,blob);
ps.executeUpdate();
ps.close();
// blob.setBytes(image.length,image);
rs.close();
st.close();
//重新从数据库中读出刚写入的内容,以便于测试。
st=conn.createStatement();
rs=st.executeQuery("select filecnt from filetable where filename='test8'");
rs.next();
blob=rs.getBlob("filecnt");
blob.getBinaryStream().read(image);
rs.close();
st.close();
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
//输出从数据库中Blob字段是存放的内容,以便验证结果。
response.setContentType("image/jpeg");
/*
* Returns a ServletOutputStream suitable for writing binary data in the response.
* The servlet container does not encode the binary data
*/
response.getOutputStream().write(image);
response.getOutputStream().close();
}
}
package upload;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.StringReader;
import javax.servlet.*;
import javax.servlet.http.*;
public class parseFileForm extends HttpServlet {
public parseFileForm() {
}
public byte[] parseOneField(HttpServletRequest request) {
try{
ServletInputStream inStream=null;//读取客户端发送过来的二进制数据
FileOutputStream tmpfileStream=null;//文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流
RandomAccessFile randomFile=null;//类的实例支持对随机存储文件的读和写操作
String tmpfileName=null;
int streamLenth=0;
long cntStartPoint=0,cntEndPoint=0;
byte[] content=null;
String sgmtDeli=null;
//获取http输入流。
inStream= request.getInputStream();
streamLenth=request.getContentLength();
//在服务器临时目录下临时文件,用于保存上传的字节流块。
tmpfileName="d:\\temp\\"+request.getSession().getId();
tmpfileStream=new FileOutputStream(tmpfileName);//创建一个tmpfileName的文件中写入文件流。
BufferedReader in=new BufferedReader(new FileReader(tmpfileName));
//获取上传内容,并将其保存在临时文件中。
int bytesRead=0,totalBytes=0;
byte[] cnt;
while (totalBytes<streamLenth)
{
cnt=new byte[256];
bytesRead=inStream.read(cnt,0,256);//将256个字节数据读入cnt数组中,0表示记录存储的位置(依次加1)
totalBytes+=bytesRead;
tmpfileStream.write(cnt); //将 cnt.length 个字节从指定 cnt(byte)数组写入此文件输出流中
// inStream.wait(1000);
}
tmpfileStream.close();
inStream.close();
//现已将Http协议上传的内容全部写入了临时文件。以下的代码便可在服务器上对上传的内容进行解释
//以随机读写方式打开http临时流文件。
randomFile=new RandomAccessFile(tmpfileName,"rw");
//寻找上传内容主体的起始位置和结束位置
sgmtDeli=randomFile.readLine();//从当前文件中读取文本的下一行。 这个方法连续地读取字节直到一个文本行的末尾。
String line=null;
for (int i=0;i<3;i++) {
line=randomFile.readLine();
}
//将起始位置存放在startPoint中。
cntStartPoint=randomFile.getFilePointer();//getFilePointer获取文件的指针位置
//定位到结束置
boolean eofblock=false;
while (!eofblock)
{
line=randomFile.readLine();
if (line.contains(sgmtDeli))
eofblock=true;
}
//将结束位置存放在endPoint中。
cntEndPoint=randomFile.getFilePointer()-line.length();
//将上传内容主体部分读入到字节数组中。
int cntlen=(int)(cntEndPoint-cntStartPoint);
content=new byte[cntlen];
randomFile.seek(cntStartPoint);//seek()定位文件指针在文件中的位置
randomFile.read(content,0,cntlen);
randomFile.close();
//删除临时文件
File file=new File(tmpfileName);
file.deleteOnExit();
return content;
}
catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
}