首页 \ 问答 \ Java - FTP程序在传输过程中损坏文件(Java - FTP program corrupting file during transfer)

Java - FTP程序在传输过程中损坏文件(Java - FTP program corrupting file during transfer)

我使用套接字创建了一个基本的客户端服务器FTP程序,但由于某些原因,文件在传输过程中被破坏了。 在下面的例子中,我正在从客户端将文件推送到服务器。 它几乎可以工作,因为一些文件(如.png)传输和打开罚款,但其他文件(.docx)则不然。 我传输的任何文件都与我发送的MD5不同。

客户代码:

File file = null;
            FTPDataBlock transferBlock;
            int numBytesRead = 0;
            int blockNumber = 1;
            int blockSize = 1024;
            byte[] block = new byte[blockSize];
            fc = new JFileChooser();

            // select file to upload
            int returnVal = fc.showOpenDialog(Client.this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                file = fc.getSelectedFile();

                try {
                    // get total number of blocks and send to server
                    int totalNumBlocks = (int)Math.ceil((file.length()*1.0) / blockSize);
                    System.out.println("File length is: " + file.length());
                    FTPCommand c = new FTPCommand("PUSH", Integer.toString(totalNumBlocks));
                    oos = new ObjectOutputStream(sock.getOutputStream());
                    oos.writeObject(c);
                    oos.flush();

                    // send to server block by block
                    FileInputStream fin = new FileInputStream(file);
                    while ((numBytesRead = fin.read(block)) != -1){
                        transferBlock = new FTPDataBlock(file.getName(), blockNumber, block);
                        blockNumber++;
                        System.out.println("Sending block " + transferBlock.getBlockNumber() + " of " + totalNumBlocks);
                        oos = new ObjectOutputStream(sock.getOutputStream());
                        oos.writeObject(transferBlock);
                        oos.flush();
                    }

                    fin.close();
                    System.out.println("PUSH Complete");

                    // get response from server
                    ois = new ObjectInputStream(sock.getInputStream());
                    FTPResponse response = (FTPResponse)ois.readObject();
                    statusArea.setText(response.getResponse());


                } catch (IOException | ClassNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

服务器代码:

else if (cmd.getCommand().equals("PUSH")){
                    // get total number of file blocks
                    int totalNumBlocks = Integer.parseInt(cmd.getParameters());

                    // get first block
                    in = new ObjectInputStream(sock.getInputStream());
                    FTPDataBlock currentBlock = (FTPDataBlock)in.readObject();

                    // create file and write first block to file
                    File file = new File (workingDirectory + File.separator + currentBlock.getFilename());
                    FileOutputStream fOut = new FileOutputStream(file);
                    fOut.write(currentBlock.getData());
                    fOut.flush();

                    // get remaining blocks
                    while(currentBlock.getBlockNumber()+1 <= totalNumBlocks){
                        in = new ObjectInputStream(sock.getInputStream());
                        currentBlock = (FTPDataBlock)in.readObject();
                        fOut.write(currentBlock.getData());
                        fOut.flush();
                    }

                    fOut.close();

                    // send response
                    FTPResponse response = new FTPResponse("File Received OK");
                    out = new ObjectOutputStream(sock.getOutputStream());
                    out.writeObject(response);
                }

FTPDataBlock类:

public class FTPDataBlock implements Serializable{

    private static final long serialVersionUID = 1L;
    private String filename;
    private int blockNumber; // current block number
    private byte[] data;
    //constructors & accessors
}

我确定这是我在这里失踪的小事。 有任何想法吗?


I've made a basic client server FTP program using sockets, but for some reason files are getting corrupted during the transfer. In the case below, I'm pushing a file to the server from the client. It almost works, since some files (such as a .png) transfer and open fine, but others (a .docx) don't. Any file that I transfer has a different MD5 to the one I sent.

Client code:

File file = null;
            FTPDataBlock transferBlock;
            int numBytesRead = 0;
            int blockNumber = 1;
            int blockSize = 1024;
            byte[] block = new byte[blockSize];
            fc = new JFileChooser();

            // select file to upload
            int returnVal = fc.showOpenDialog(Client.this);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                file = fc.getSelectedFile();

                try {
                    // get total number of blocks and send to server
                    int totalNumBlocks = (int)Math.ceil((file.length()*1.0) / blockSize);
                    System.out.println("File length is: " + file.length());
                    FTPCommand c = new FTPCommand("PUSH", Integer.toString(totalNumBlocks));
                    oos = new ObjectOutputStream(sock.getOutputStream());
                    oos.writeObject(c);
                    oos.flush();

                    // send to server block by block
                    FileInputStream fin = new FileInputStream(file);
                    while ((numBytesRead = fin.read(block)) != -1){
                        transferBlock = new FTPDataBlock(file.getName(), blockNumber, block);
                        blockNumber++;
                        System.out.println("Sending block " + transferBlock.getBlockNumber() + " of " + totalNumBlocks);
                        oos = new ObjectOutputStream(sock.getOutputStream());
                        oos.writeObject(transferBlock);
                        oos.flush();
                    }

                    fin.close();
                    System.out.println("PUSH Complete");

                    // get response from server
                    ois = new ObjectInputStream(sock.getInputStream());
                    FTPResponse response = (FTPResponse)ois.readObject();
                    statusArea.setText(response.getResponse());


                } catch (IOException | ClassNotFoundException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }

Server Code:

else if (cmd.getCommand().equals("PUSH")){
                    // get total number of file blocks
                    int totalNumBlocks = Integer.parseInt(cmd.getParameters());

                    // get first block
                    in = new ObjectInputStream(sock.getInputStream());
                    FTPDataBlock currentBlock = (FTPDataBlock)in.readObject();

                    // create file and write first block to file
                    File file = new File (workingDirectory + File.separator + currentBlock.getFilename());
                    FileOutputStream fOut = new FileOutputStream(file);
                    fOut.write(currentBlock.getData());
                    fOut.flush();

                    // get remaining blocks
                    while(currentBlock.getBlockNumber()+1 <= totalNumBlocks){
                        in = new ObjectInputStream(sock.getInputStream());
                        currentBlock = (FTPDataBlock)in.readObject();
                        fOut.write(currentBlock.getData());
                        fOut.flush();
                    }

                    fOut.close();

                    // send response
                    FTPResponse response = new FTPResponse("File Received OK");
                    out = new ObjectOutputStream(sock.getOutputStream());
                    out.writeObject(response);
                }

FTPDataBlock class:

public class FTPDataBlock implements Serializable{

    private static final long serialVersionUID = 1L;
    private String filename;
    private int blockNumber; // current block number
    private byte[] data;
    //constructors & accessors
}

I'm sure it's something small that I'm missing here. Any ideas?


原文:https://stackoverflow.com/questions/21606473
更新时间:2023-10-04 18:10

最满意答案

我不是100%肯定我理解你的问题。 是#wrapper上的白色背景没有降到页面底部吗?

如果是这样:

  • #wrapper的结束标记#wrapper ,添加: <br style="clear: both" />
  • #forumStats中删除height: 50px并添加overflow: auto

这在Firefox中修复了它。


I'm not 100% certain I understand your problem. Is is that the white background on #wrapper does not come down to the bottom of the page?

If so:

  • Just before the closing tag for #wrapper, add: <br style="clear: both" />.
  • From #forumStats, remove height: 50px and add overflow: auto.

This fixes it in Firefox.

相关问答

更多

相关文章

更多

最新问答

更多
  • 获取MVC 4使用的DisplayMode后缀(Get the DisplayMode Suffix being used by MVC 4)
  • 如何通过引用返回对象?(How is returning an object by reference possible?)
  • 矩阵如何存储在内存中?(How are matrices stored in memory?)
  • 每个请求的Java新会话?(Java New Session For Each Request?)
  • css:浮动div中重叠的标题h1(css: overlapping headlines h1 in floated divs)
  • 无论图像如何,Caffe预测同一类(Caffe predicts same class regardless of image)
  • xcode语法颜色编码解释?(xcode syntax color coding explained?)
  • 在Access 2010 Runtime中使用Office 2000校对工具(Use Office 2000 proofing tools in Access 2010 Runtime)
  • 从单独的Web主机将图像传输到服务器上(Getting images onto server from separate web host)
  • 从旧版本复制文件并保留它们(旧/新版本)(Copy a file from old revision and keep both of them (old / new revision))
  • 西安哪有PLC可控制编程的培训
  • 在Entity Framework中选择基类(Select base class in Entity Framework)
  • 在Android中出现错误“数据集和渲染器应该不为null,并且应该具有相同数量的系列”(Error “Dataset and renderer should be not null and should have the same number of series” in Android)
  • 电脑二级VF有什么用
  • Datamapper Ruby如何添加Hook方法(Datamapper Ruby How to add Hook Method)
  • 金华英语角.
  • 手机软件如何制作
  • 用于Android webview中图像保存的上下文菜单(Context Menu for Image Saving in an Android webview)
  • 注意:未定义的偏移量:PHP(Notice: Undefined offset: PHP)
  • 如何读R中的大数据集[复制](How to read large dataset in R [duplicate])
  • Unity 5 Heighmap与地形宽度/地形长度的分辨率关系?(Unity 5 Heighmap Resolution relationship to terrain width / terrain length?)
  • 如何通知PipedOutputStream线程写入最后一个字节的PipedInputStream线程?(How to notify PipedInputStream thread that PipedOutputStream thread has written last byte?)
  • python的访问器方法有哪些
  • DeviceNetworkInformation:哪个是哪个?(DeviceNetworkInformation: Which is which?)
  • 在Ruby中对组合进行排序(Sorting a combination in Ruby)
  • 网站开发的流程?
  • 使用Zend Framework 2中的JOIN sql检索数据(Retrieve data using JOIN sql in Zend Framework 2)
  • 条带格式类型格式模式编号无法正常工作(Stripes format type format pattern number not working properly)
  • 透明度错误IE11(Transparency bug IE11)
  • linux的基本操作命令。。。