java中如何实现从客户端发送文件到服务器端?

java中如何实现从客户端发送文件到服务器端?,第1张

服务器端源码:\x0d\x0aimport java.io.BufferedReader\x0d\x0aimport java.io.File\x0d\x0aimport java.io.FileNotFoundException\x0d\x0aimport java.io.FileOutputStream\x0d\x0aimport java.io.IOException\x0d\x0aimport java.io.InputStream\x0d\x0aimport java.io.InputStreamReader\x0d\x0aimport java.net.ServerSocket\x0d\x0aimport java.net.Socket\x0d\x0a\x0d\x0a/**\x0d\x0a *\x0d\x0a * 文件名:ServerReceive.java\x0d\x0a * 实现功能:作为服务器接收客户端发送的文件\x0d\x0a *\x0d\x0a * 具体实现过程:\x0d\x0a * 1、建立SocketServer,等待客户端的连接\x0d\x0a * 2、当有客户端虚键毁连接的时候,按照双方的约定,这时要读取一行数据\x0d\x0a * 其中保存客户端要发送的文件名和文件大小信息\x0d\x0a * 3、根据文件名在本地创建文件,并建立好流通信\x0d\x0a * 4、循环接收数据包,将数据包写入文件\x0d\x0a * 5、当接收数据的长度等于提前文件发过来的文件长亮伏度,即表示文件接收完毕,关闭文件差备\x0d\x0a * 6、文件接收工作结束\x0d\x0a\x0d\x0apublic class ServerReceive {\x0d\x0a \x0d\x0apublic static void main(String[] args) {\x0d\x0a \x0d\x0a/**与服务器建立连接的通信句柄*/\x0d\x0aServerSocket ss = null\x0d\x0aSocket s = null\x0d\x0a \x0d\x0a/**定义用于在接收后在本地创建的文件对象和文件输出流对象*/\x0d\x0aFile file = null\x0d\x0aFileOutputStream fos = null\x0d\x0a \x0d\x0a/**定义输入流,使用socket的inputStream对数据包进行输入*/\x0d\x0aInputStream is = null\x0d\x0a \x0d\x0a/**定义byte数组来作为数据包的存储数据包*/\x0d\x0abyte[] buffer = new byte[4096 * 5]\x0d\x0a \x0d\x0a/**用来接收文件发送请求的字符串*/\x0d\x0aString comm = null\x0d\x0a\x0d\x0a/**建立socekt通信,等待服务器进行连接*/\x0d\x0atry {\x0d\x0ass = new ServerSocket(4004)\x0d\x0as = ss.accept()\x0d\x0a} catch (IOException e) {\x0d\x0ae.printStackTrace()\x0d\x0a}\x0d\x0a\x0d\x0a/**读取一行客户端发送过来的约定信息*/\x0d\x0atry {\x0d\x0aInputStreamReader isr = new InputStreamReader(s.getInputStream())\x0d\x0aBufferedReader br = new BufferedReader(isr)\x0d\x0acomm = br.readLine()\x0d\x0a} catch (IOException e) {\x0d\x0aSystem.out.println("服务器与客户端断开连接")\x0d\x0a}\x0d\x0a \x0d\x0a/**开始解析客户端发送过来的请求命令*/\x0d\x0aint index = comm.indexOf("/#")\x0d\x0a \x0d\x0a/**判断协议是否为发送文件的协议*/\x0d\x0aString xieyi = comm.substring(0, index)\x0d\x0aif(!xieyi.equals("111")){\x0d\x0aSystem.out.println("服务器收到的协议码不正确")\x0d\x0areturn\x0d\x0a}\x0d\x0a \x0d\x0a/**解析出文件的名字和大小*/\x0d\x0acomm = comm.substring(index + 2)\x0d\x0aindex = comm.indexOf("/#")\x0d\x0aString filename = comm.substring(0, index).trim()\x0d\x0aString filesize = comm.substring(index + 2).trim()\x0d\x0a\x0d\x0a/**创建空文件,用来进行接收文件*/\x0d\x0afile = new File(filename)\x0d\x0aif(!file.exists()){\x0d\x0atry {\x0d\x0afile.createNewFile()\x0d\x0a} catch (IOException e) {\x0d\x0aSystem.out.println("服务器端创建文件失败")\x0d\x0a}\x0d\x0a}else{\x0d\x0a/**在此也可以询问是否覆盖*/\x0d\x0aSystem.out.println("本路径已存在相同文件,进行覆盖")\x0d\x0a}\x0d\x0a \x0d\x0a/**【以上就是客户端代码中写到的服务器的准备部分】*/\x0d\x0a\x0d\x0a/**\x0d\x0a * 服务器接收文件的关键代码*/\x0d\x0atry {\x0d\x0a/**将文件包装到文件输出流对象中*/\x0d\x0afos = new FileOutputStream(file)\x0d\x0along file_size = Long.parseLong(filesize)\x0d\x0ais = s.getInputStream()\x0d\x0a/**size为每次接收数据包的长度*/\x0d\x0aint size = 0\x0d\x0a/**count用来记录已接收到文件的长度*/\x0d\x0along count = 0\x0d\x0a \x0d\x0a/**使用while循环接收数据包*/\x0d\x0awhile(count 回答于 2022-12-11

客户端代码如下:

import java.io.DataOutputStream  

import java.io.File  

import java.io.FileInputStream  

import java.io.IOException  

import java.net.InetSocketAddress  

import java.net.Socket  

  

/** 

 * 文件发送客户端主程序 

 * @author admin_Hzw 

 * 

 */  

public class BxClient {  

      

    /** 

     * 程序main方法 

     * @param args 

     * @throws IOException 

     */  

    public static void main(String[] args) throws IOException {  

        int length = 0  

        double sumL = 0   

        byte[] sendBytes = null  

        Socket socket = null  

        DataOutputStream dos = null  

        FileInputStream fis = null  

        boolean bool = false  

 枯拦       try {  

            File file = new File("D:/天啊.zip") //要传输的文件路径  

            long l = file.length()   

            socket = new Socket()    

            socket.connect(new InetSocketAddress("127.0.0.1", 48123))  

            dos = new DataOutputStream(socket.getOutputStream())  

            fis = new FileInputStream(file)        

            sendBytes = new byte[1024]    

            while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {  

                sumL += length    

                System.out.println("已传输:"+((sumL/l)*100)+"%")  

                dos.write(sendBytes, 0, length)  

                dos.flush()  

            }   

            //虽然数据类型不同,但JAVA会自动转换成相同数据类型后在做比较  

            if(sumL==l){  

                bool = true  

            }  

        }catch (Exception e) {  

            System.out.println("客户端文件传输异常")  

            bool = false  

            e.printStackTrace()    

        } finally{    

            if (dos != null)  

                dos.close()  

           没此胡 if (fis != null)  

                fis.close()     

            if (socket != null)  

                socket.close()      

        }  

        System.out.println(bool?"成功":"失败")  

    }  

}

服务端代码如下:

import java.io.DataInputStream  

import java.io.File  

import java.io.FileOutputStream  

import java.io.IOException  

import java.net.ServerSocket  

import java.net.Socket  

import java.util.Random  

import com.boxun.util.GetDate  

  

  

/** 

 * 接收文件服务 

 * @author admin_Hzw 

 * 

 */  

public class BxServerSocket {  

      

    /** 

     * 工程main方法 

     * @param args 

     */  

    public static void main(String[] args) {  

        try {  

            final ServerSocket server = new ServerSocket(48123)  

            Thread th = new Thread(new Runnable() {  

                扒知public void run() {  

                    while (true) {  

                        try {    

                            System.out.println("开始监听...")  

                            /* 

                             * 如果没有访问它会自动等待 

                             */  

                            Socket socket = server.accept()  

                            System.out.println("有链接")  

                            receiveFile(socket)  

                        } catch (Exception e) {  

                            System.out.println("服务器异常")  

                            e.printStackTrace()  

                        }  

                    }  

                }  

            })  

            th.run() //启动线程运行  

        } catch (Exception e) {  

            e.printStackTrace()  

        }       

    }  

  

    public void run() {  

    }  

  

    /** 

     * 接收文件方法 

     * @param socket 

     * @throws IOException 

     */  

    public static void receiveFile(Socket socket) throws IOException {  

        byte[] inputByte = null  

        int length = 0  

        DataInputStream dis = null  

        FileOutputStream fos = null  

        String filePath = "D:/temp/"+GetDate.getDate()+"SJ"+new Random().nextInt(10000)+".zip"  

        try {  

            try {  

                dis = new DataInputStream(socket.getInputStream())  

                File f = new File("D:/temp")  

                if(!f.exists()){  

                    f.mkdir()    

                }  

                /*   

                 * 文件存储位置   

                 */  

                fos = new FileOutputStream(new File(filePath))      

                inputByte = new byte[1024]     

                System.out.println("开始接收数据...")    

                while ((length = dis.read(inputByte, 0, inputByte.length)) > 0) {  

                    fos.write(inputByte, 0, length)  

                    fos.flush()      

                }  

                System.out.println("完成接收:"+filePath)  

            } finally {  

                if (fos != null)  

                    fos.close()  

                if (dis != null)  

                    dis.close()  

                if (socket != null)  

                    socket.close()   

            }  

        } catch (Exception e) {  

            e.printStackTrace()  

        }  

    }  

}

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/htmlcharset=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=0temp<ERRORTYPE.LENGTHTEMP++){

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为例,表结构如下:

字段名:namefilecode

类型: 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+" ")

}

。。。。。。

这样就实现了上传文件至数据库


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8245072.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存