java實現上傳
可以使用Apache的common-fileupload組件進行上傳。
當然也可以使用其他方式,如ftp上傳等,可以用Apache下的common-net工具包。
剩下的就是在servlet、spring等框架中如何使用這些上傳工具包。這些框架都有介面實現在那裡。調用就可以。
② 如何實現java 流式文件上傳
@Controller
public class UploadController extends BaseController {
 
    private static final Log log = LogFactory.getLog(UploadController.class);
    private UploadService uploadService;
    private AuthService authService;
 
    /**
     * 大文件分成小文件塊上傳,一次傳遞一塊,最後一塊上傳成功後,將合並所有已經上傳的塊,保存到File Server
     * 上相應的位置,並返回已經成功上傳的文件的詳細屬性. 當最後一塊上傳完畢,返回上傳成功的信息。此時用getFileList查詢該文件,
     * 該文件的uploadStatus為2。client請自行處理該狀態下文件如何顯示。(for UPS Server)
     * 
     */
    @RequestMapping("/core/v1/file/upload")
    @ResponseBody
    public Object upload(HttpServletResponse response,
            @RequestParam(value = "client_id", required = false) String appkey,
            @RequestParam(value = "sig", required = false) String appsig,
            @RequestParam(value = "token", required = false) String token,
            @RequestParam(value = "uuid", required = false) String uuid,
            @RequestParam(value = "block", required = false) String blockIndex,
            @RequestParam(value = "file", required = false) MultipartFile multipartFile,
            @RequestParam Map<String, String> parameters) {
 
        checkEmpty(appkey, BaseException.ERROR_CODE_16002);
        checkEmpty(token, BaseException.ERROR_CODE_16007);
        checkEmpty(uuid, BaseException.ERROR_CODE_20016);
        checkEmpty(blockIndex, BaseException.ERROR_CODE_20006);
        checkEmpty(appsig, BaseException.ERROR_CODE_10010);
        if (multipartFile == null) {
            throw new BaseException(BaseException.ERROR_CODE_20020);// 上傳文件不存在
        }
        Long uuidL = parseLong(uuid, BaseException.ERROR_CODE_20016);
        Integer blockIndexI = parseInt(blockIndex, BaseException.ERROR_CODE_20006);
         
        Map<String, Object> appMap = getAuthService().validateSigature(parameters);
 
        AccessToken accessToken = CasUtil.checkAccessToken(token, appMap);
        Long uid = accessToken.getUid();
        String bucketUrl = accessToken.getBucketUrl();
        // 從上傳目錄拷貝文件到工作目錄
        String fileAbsulutePath = null;
        try {
            fileAbsulutePath = this.File(multipartFile.getInputStream(), multipartFile.getOriginalFilename());
        } catch (IOException ioe) {
            log.error(ioe.getMessage(), ioe);
            throw new BaseException(BaseException.ERROR_CODE_20020);// 上傳文件不存在
        }
        File uploadedFile = new File(Global.UPLOAD_TEMP_DIR + fileAbsulutePath);
        checkEmptyFile(uploadedFile);// file 非空驗證
 
        Object rs = uploadService.upload(uuidL, blockIndexI, uid, uploadedFile, bucketUrl);
        setHttpStatusOk(response);
        return rs;
    }
 
    // TODO 查看下這里是否有問題
    // 上傳文件非空驗證
    private void checkEmptyFile(File file) {
        if (file == null || file.getAbsolutePath() == null) {
            throw new BaseException(BaseException.ERROR_CODE_20020);// 上傳文件不存在
        }
    }
 
    /**
     * 寫文件到本地文件夾
     * 
     * @throws IOException
     *             返回生成的文件名
     */
    private String File(InputStream inputStream, String fileName) {
        OutputStream outputStream = null;
        String tempFileName = null;
        int pointPosition = fileName.lastIndexOf(".");
        if (pointPosition < 0) {// myvedio
            tempFileName = UUID.randomUUID().toString();// 94d1d2e0-9aad-4dd8-a0f6-494b0099ff26
        } else {// myvedio.flv
            tempFileName = UUID.randomUUID() + fileName.substring(pointPosition);// 94d1d2e0-9aad-4dd8-a0f6-494b0099ff26.flv
        }
        try {
            outputStream = new FileOutputStream(Global.UPLOAD_TEMP_DIR + tempFileName);
            int readBytes = 0;
            byte[] buffer = new byte[10000];
            while ((readBytes = inputStream.read(buffer, 0, 10000)) != -1) {
                outputStream.write(buffer, 0, readBytes);
            }
            return tempFileName;
        } catch (IOException ioe) {
            // log.error(ioe.getMessage(), ioe);
            throw new BaseException(BaseException.ERROR_CODE_20020);// 上傳文件不存在
        } finally {
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                }
            }
 
        }
 
    }
 
    /**
     * 測試此服務是否可用
     * 
     * @param response
     * @return
     * @author zwq7978
     */
    @RequestMapping("/core/v1/file/testServer")
    @ResponseBody
    public Object testServer(HttpServletResponse response) {
        setHttpStatusOk(response);
        return Global.SUCCESS_RESPONSE;
    }
 
    public UploadService getUploadService() {
        return uploadService;
    }
 
    public void setUploadService(UploadService uploadService) {
        this.uploadService = uploadService;
    }
 
    public void setAuthService(AuthService authService) {
        this.authService = authService;
    }
 
    public AuthService getAuthService() {
        return authService;
    }
 
}
③ java怎麼實現上傳附件的功能
上傳附件,實際上就是將文件存儲到遠程伺服器,進行臨時存儲。舉例:
**
* 上傳文件
*
* @param fileName
* @param plainFilePath 文件路徑路徑
* @param filepath
* @return 
* @throws Exception
*/
public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
FTPClient ftpClient = new FTPClient();
String bl = "false";
try {
fis = new FileInputStream(plainFilePath);
bos = new ByteArrayOutputStream(fis.available());
byte[] buffer = new byte[1024];
int count = 0;
while ((count = fis.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
Log.info("加密上傳文件開始");
Log.info("連接遠程上傳伺服器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
FTPFile[] fs;
fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(filepath)) {
bl="true";
ftpClient.changeWorkingDirectory("/"+filepath+"");
}
}
Log.info("檢查文件路徑是否存在:/"+filepath);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon( "查詢文件路徑不存在:"+"/"+filepath);
return bl;
}
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
// 設置文件類型(二進制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
Log.info("上傳文件成功:"+fileName+"。文件保存路徑:"+"/"+filepath+"/");
return bl;
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
}
}
備註:只需要修改上傳的伺服器地址、用戶名、密碼即可進行伺服器訪問上傳。根據實際需要修改即可。
④ java實現多文件上傳
即使再多文件也是通過的單個文件逐次上傳的(zip等壓縮包實際上是一個文件)。實現思路就是將多個文件循環進行上傳,上傳方法舉例:
/**
* 上傳文件
*
* @param fileName
* @param plainFilePath 文件路徑路徑
* @param filepath
* @return 
* @throws Exception
*/
public static String fileUploadByFtp(String plainFilePath, String fileName, String filepath) throws Exception {
FileInputStream fis = null;
ByteArrayOutputStream bos = null;
FTPClient ftpClient = new FTPClient();
String bl = "false";
try {
fis = new FileInputStream(plainFilePath);
bos = new ByteArrayOutputStream(fis.available());
byte[] buffer = new byte[1024];
int count = 0;
while ((count = fis.read(buffer)) != -1) {
bos.write(buffer, 0, count);
}
bos.flush();
Log.info("加密上傳文件開始");
Log.info("連接遠程上傳伺服器"+CCFCCBUtil.CCFCCBHOSTNAME+":"+22);
ftpClient.connect(CCFCCBUtil.CCFCCBHOSTNAME, 22);
ftpClient.login(CCFCCBUtil.CCFCCBLOGINNAME, CCFCCBUtil.CCFCCBLOGINPASSWORD);
FTPFile[] fs;
fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
if (ff.getName().equals(filepath)) {
bl="true";
ftpClient.changeWorkingDirectory("/"+filepath+"");
}
}
Log.info("檢查文件路徑是否存在:/"+filepath);
if("false".equals(bl)){
ViewUtil.dataSEErrorPerformedCommon( "查詢文件路徑不存在:"+"/"+filepath);
return bl;
}
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding("GBK");
// 設置文件類型(二進制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(fileName, fis);
Log.info("上傳文件成功:"+fileName+"。文件保存路徑:"+"/"+filepath+"/");
return bl;
} catch (Exception e) {
throw e;
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
if (bos != null) {
try {
bos.close();
} catch (Exception e) {
Log.info(e.getLocalizedMessage(), e);
}
}
}
}
備註:只需要修改上傳的伺服器地址、用戶名、密碼即可進行伺服器訪問上傳。根據實際需要修改即可。
⑤ Java怎樣實現跨伺服器文件上傳
另一台機器也要有處理文件上傳的WEB程序,你可以參考Stream上傳插件(支持HTML5和Flash兩種方式上傳)
Stream 上傳插件
Stream 是解決不同瀏覽器上傳文件的插件,是Uploadify的Flash版和Html5版的結合!
Stream 簡介
Stream 是根據某網的文件上傳插件加工而來,支持不同平台(Windows, Linux, Mac, Android, iOS)下,主流瀏覽器(IE7+, Chrome, Firefox, Safari, 其他)的上傳工作,當然在Html5標准下,還支持文件的斷點續傳功能,有效解決大文件的Web上傳問題!
主要特徵
1. 源碼完全開放,目前有Java、PHP、Perl三種後台語言實現
2. 支持HTML5、Flash兩種方式(跨域)上傳
3. 多文件一起上傳
4. HTML5支持斷點續傳,拖拽等新特性
5. 兼容性好IE7+, FF3.6+, Chrome*,Safari4+,遨遊等主流瀏覽器
6. 進度條、速度、剩餘時間等附屬信息
7. `選擇文件的按鈕`可以自定義
8. 簡單的參數配置實現 靈活多變的功能
9. 支持文件夾上傳(Chrome21+, Opera15+)
10. 支持自定義UI(V1.4+)
指定跨域上傳就可以了
⑥ java如何實現文件上傳
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 自動生成 catch 塊
e.printStackTrace();
}
return receiveLen;
}
這個方法從InputStream中讀取內容,寫到OutputStream中。
那麼發送文件方,InputStream就是FileInputStream,OutputStream就是Socket.getOutputStream.
接受文件方,InputStream就是Socket.getInputStream,OutputStream就是FileOutputStream。
就OK了。 至於存到資料庫里嘛,Oracle里用Blob。搜索一下,也是一樣的。從Blob能獲取一個輸出流。
⑦ java實現文件上傳,代碼盡量簡潔~~~~~·
你說的2種方法都是很簡單的,參考網上的資料都不難做出,用io流做更是基礎中的基礎,我說下smartupload好了,有的人是直接寫在jsp上面,感覺比較亂,我一般都是寫在action裡面,打好jar包和配置後
SmartUpload mySmartUpload = new SmartUpload();
//如果是struts2.0或者webwork 則是mySmartUpload.initialize(ServletActionContext.getServletConfig(),ServletActionContext.getRequest(),ServletActionContext.getResponse());
mySmartUpload.initialize(servlet.getServletConfig(), request,response);
mySmartUpload.setTotalMaxFileSize(500000);
//如果上傳任意文件不設置mySmartUpload.setAllowedFilesList(文件後綴名)就可以了
mySmartUpload.upload();
  for (int i = 0; i < mySmartUpload.getFiles().getCount(); i++) {
  com.jspsmart.upload.File file = mySmartUpload.getFiles().getFile(i);
  if (file.isMissing()) continue;
  file.saveAs(保存的地址 + file.getFileName(), 
su.SAVE_PHYSICAL);
⑧ java上傳文件怎麼實現的
- common-fileupload是jakarta項目組開發的一個功能很強大的上傳文件組件 
- 下面先介紹上傳文件到伺服器(多文件上傳): 
- 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(); 
- // 設置允許用戶上傳文件大小,單位:位元組,這里設為2m 
- fu.setSizeMax(2*1024*1024); 
- // 設置最多隻允許在內存中存儲的數據,單位:位元組 
- fu.setSizeThreshold(4096); 
- // 設置一旦文件大小超過getSizeThreshold()的值時數據存放在硬碟的目錄 
- fu.setRepositoryPath("c://windows//temp"); 
- //開始讀取上傳信息 
- List fileItems = fu.parseRequest(request); 
- // 依次處理每個上傳的文件 
- Iterator iter = fileItems.iterator(); 
- //正則匹配,過濾路徑取文件名 
- String regExp=".+////(.+)$"; 
- //過濾掉的文件類型 
- 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;temp<ERRORTYPE.LENGTH;TEMP++){ 
- if (m.group(1).endsWith(errorType[temp])){ 
- throw new IOException(name+": wrong type"); 
- } 
- } 
- try{ 
- //保存上傳的文件到指定的目錄 
- //在下文中上傳文件至資料庫時,將對這里改寫 
- 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); 
- } 
- } 
- } 
- 現在介紹上傳文件到伺服器,下面只寫出相關代碼: 
- 以sql2000為例,表結構如下: 
- 欄位名:name filecode 
- 類型: varchar image 
- 資料庫插入代碼為:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)"); 
- 代碼如下: 
- 。。。。。。 
- try{ 
- 這段代碼如果不去掉,將一同寫入到伺服器中 
- //item.write(new File("d://" + m.group(1))); 
- int byteread=0; 
- //讀取輸入流,也就是上傳的文件內容 
- InputStream inStream=item.getInputStream(); 
- pstmt.setString(1,m.group(1)); 
- pstmt.setBinaryStream(2,inStream,(int)size); 
- pstmt.executeUpdate(); 
- inStream.close(); 
- out.println(name+" "+size+" "); 
- } 
- 。。。。。。 
- 這樣就實現了上傳文件至資料庫 
