// 這是我寫(xiě)的一個(gè)方法,里面只需要傳兩個(gè)參數(shù)就OK了,在任何地方調(diào)用此方法都可以文件上傳
成都創(chuàng)新互聯(lián)網(wǎng)絡(luò)公司擁有十年的成都網(wǎng)站開(kāi)發(fā)建設(shè)經(jīng)驗(yàn),數(shù)千家客戶的共同信賴。提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站開(kāi)發(fā)、網(wǎng)站定制、買(mǎi)鏈接、建網(wǎng)站、網(wǎng)站搭建、響應(yīng)式網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格,提供周到的售前咨詢和貼心的售后服務(wù)
/**
* 上傳文件
* @param file待上傳的文件
* @param storePath待存儲(chǔ)的路徑(該路徑還包括文件名)
*/
public void uploadFormFile(FormFile file,String storePath)throws Exception{
// 開(kāi)始上傳
InputStream is =null;
OutputStream os =null;
try {
is = file.getInputStream();
os = new FileOutputStream(storePath);
int bytes = 0;
byte[] buffer = new byte[8192];
while ((bytes = is.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytes);
}
os.close();
is.close();
} catch (Exception e) {
throw e;
}
finally{
if(os!=null){
try{
os.close();
os=null;
}catch(Exception e1){
;
}
}
if(is!=null){
try{
is.close();
is=null;
}catch(Exception e1){
;
}
}
}
}
public static int transFile(InputStream in, OutputStream out, int fileSize) {
int receiveLen = 0;
final int bufSize = 1000;
try {
byte[] buf = new byte[bufSize];
int len = 0;
while(fileSize - receiveLen bufSize)
{
len = in.read(buf);
out.write(buf, 0, len);
out.flush();
receiveLen += len;
System.out.println(len);
}
while(receiveLen fileSize)
{
len = in.read(buf, 0, fileSize - receiveLen);
System.out.println(len);
out.write(buf, 0, len);
receiveLen += len;
out.flush();
}
} catch (IOException e) {
// TODO 自動(dòng)生成 catch 塊
e.printStackTrace();
}
return receiveLen;
}
這個(gè)方法從InputStream中讀取內(nèi)容,寫(xiě)到OutputStream中。
那么發(fā)送文件方,InputStream就是FileInputStream,OutputStream就是Socket.getOutputStream.
接受文件方,InputStream就是Socket.getInputStream,OutputStream就是FileOutputStream。
就OK了。 至于存到數(shù)據(jù)庫(kù)里嘛,Oracle里用Blob。搜索一下,也是一樣的。從Blob能獲取一個(gè)輸出流。
文件從本地到服務(wù)器的功能,其實(shí)是為了解決目前瀏覽器不支持獲取本地文件全路徑。不得已而想到上傳到服務(wù)器的固定目錄,從而方便項(xiàng)目獲取文件,進(jìn)而使程序支持EXCEL批量導(dǎo)入數(shù)據(jù)。
java中文件上傳到服務(wù)器的指定路徑的代碼:
在前臺(tái)界面中輸入:
form method="post" enctype="multipart/form-data" ?action="../manage/excelImport.do"
請(qǐng)選文件:input type="file" ?name="excelFile"
input type="submit" value="導(dǎo)入" onclick="return impExcel();"/
/form
action中獲取前臺(tái)傳來(lái)數(shù)據(jù)并保存
/**
* excel 導(dǎo)入文件
* @return
* @throws IOException
*/
@RequestMapping("/usermanager/excelImport.do")
public String excelImport(
String filePath,
MultipartFile ?excelFile,HttpServletRequest request) throws IOException{
log.info("action:{} Method:{} start","usermanager","excelImport" );
if (excelFile != null){
String filename=excelFile.getOriginalFilename();
String a=request.getRealPath("u/cms/www/201509");
SaveFileFromInputStream(excelFile.getInputStream(),request.getRealPath("u/cms/www/201509"),filename);//保存到服務(wù)器的路徑
}
log.info("action:{} Method:{} end","usermanager","excelImport" );
return "";
}
/**
* 將MultipartFile轉(zhuǎn)化為file并保存到服務(wù)器上的某地
*/
public void SaveFileFromInputStream(InputStream stream,String path,String savefile) throws IOException
{ ? ?
FileOutputStream fs=new FileOutputStream( path + "/"+ savefile);
System.out.println("------------"+path + "/"+ savefile);
byte[] buffer =new byte[1024*1024];
int bytesum = 0;
int byteread = 0;
while ((byteread=stream.read(buffer))!=-1)
{
bytesum+=byteread;
fs.write(buffer,0,byteread);
fs.flush();
}
fs.close();
stream.close();
}
Java代碼實(shí)現(xiàn)文件上傳
FormFile?file=manform.getFile();?
String?newfileName?=?null;
String?newpathname=null;
String?fileAddre="/numUp";
try?{
InputStream?stream?=?file.getInputStream();//?把文件讀入
String?filePath?=?request.getRealPath(fileAddre);//取系統(tǒng)當(dāng)前路徑
File?file1?=?new?File(filePath);//添加了自動(dòng)創(chuàng)建目錄的功能
((File)?file1).mkdir();???
newfileName?=?System.currentTimeMillis()
+?file.getFileName().substring(
file.getFileName().lastIndexOf('.'));
ByteArrayOutputStream?baos?=?new?ByteArrayOutputStream();
OutputStream?bos?=?new?FileOutputStream(filePath?+?"/"
+?newfileName);
newpathname=filePath+"/"+newfileName;
System.out.println(newpathname);
//?建立一個(gè)上傳文件的輸出流
System.out.println(filePath+"/"+file.getFileName());
int?bytesRead?=?0;
byte[]?buffer?=?new?byte[8192];
while?((bytesRead?=?stream.read(buffer,?0,?8192))?!=?-1)?{
bos.write(buffer,?0,?bytesRead);//?將文件寫(xiě)入服務(wù)器
}
bos.close();
stream.close();
}?catch?(FileNotFoundException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}
common-fileupload是jakarta項(xiàng)目組開(kāi)發(fā)的一個(gè)功能很強(qiáng)大的上傳文件組件
下面先介紹上傳文件到服務(wù)器(多文件上傳):
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;
public class upload extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GB2312";
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
try {
DiskFileUpload fu = new DiskFileUpload();
// 設(shè)置允許用戶上傳文件大小,單位:字節(jié),這里設(shè)為2m
fu.setSizeMax(2*1024*1024);
// 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié)
fu.setSizeThreshold(4096);
// 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤(pán)的目錄
fu.setRepositoryPath("c://windows//temp");
//開(kāi)始讀取上傳信息
List fileItems = fu.parseRequest(request);
// 依次處理每個(gè)上傳的文件
Iterator iter = fileItems.iterator();
//正則匹配,過(guò)濾路徑取文件名
String regExp=".+////(.+)$";
//過(guò)濾掉的文件類(lèi)型
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
?FileItem item = (FileItem)iter.next();
?//忽略其他不是文件域的所有表單信息
?if (!item.isFormField()) {
? ? ?String name = item.getName();
? ? ?long size = item.getSize();
? ? ?if((name==null||name.equals("")) size==0)
? ? ? ? ?continue;
?Matcher m = p.matcher(name);
?boolean result = m.find();
?if (result){
? ? ?for (int temp=0;tempERRORTYPE.LENGTH;TEMP++){
? ? ?if (m.group(1).endsWith(errorType[temp])){
? ? ? ? ? ?throw new IOException(name+": wrong type");
? ? ?}
? ? ?}
? ? ?try{
//保存上傳的文件到指定的目錄
//在下文中上傳文件至數(shù)據(jù)庫(kù)時(shí),將對(duì)這里改寫(xiě)
? ? ?item.write(new File("d://" + m.group(1)));
out.print(name+" ?"+size+"");
? ? ?}
? ? ?catch(Exception e){
? ? ? ?out.println(e);
? ? ?}
}
?else
?{
? ?throw new IOException("fail to upload");
?}
?}
}
}
catch (IOException e){
out.println(e);
}
catch (FileUploadException e){
out.println(e);
}
}
}
現(xiàn)在介紹上傳文件到服務(wù)器,下面只寫(xiě)出相關(guān)代碼:
以sql2000為例,表結(jié)構(gòu)如下:
字段名:name ? ?filecode
類(lèi)型: varchar ? ? image
數(shù)據(jù)庫(kù)插入代碼為:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");
代碼如下:
。。。。。。
try{
? 這段代碼如果不去掉,將一同寫(xiě)入到服務(wù)器中
? //item.write(new File("d://" + m.group(1)));
? ? ?
? int byteread=0;
? //讀取輸入流,也就是上傳的文件內(nèi)容
? InputStream inStream=item.getInputStream(); ? ? ? ? ? ?
pstmt.setString(1,m.group(1));
? pstmt.setBinaryStream(2,inStream,(int)size);
? pstmt.executeUpdate();
? inStream.close();
out.println(name+" ?"+size+" ");
? }
。。。。。。
這樣就實(shí)現(xiàn)了上傳文件至數(shù)據(jù)庫(kù)