【求助】使用vertx-web上传压缩包,然后保存到磁盘,文件大小为0,测试上传的压缩包12M左右,里面包含较多文件

文章描述了一个Node.js路由处理上传文件时遇到的问题,文件在磁盘中大小为0,以及双击压缩文件时出现错误导致文件无法使用的现象。
摘要由CSDN通过智能技术生成

#代码处理#

```

router.route("/upload").handler(ctx -> {
    HttpServerRequest request = ctx.request();
    request.setExpectMultipart(true);
    request.uploadHandler(handler -> {
        handler.streamToFileSystem("D:\\" + handler.filename());
    });
    request.response().end("upload successfully");
});

```

-  在磁盘中存的文件大小为0

双击打开压缩文件,弹出错误框,点击确认后,压缩文件包会变大,但是仍然不能使用文件

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FileUploadServlet.class package test; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class FileUploadServlet extends HttpServlet { // 定义文件上传路径 private String uploadPath = "G://upload/"; // 限制文件上传大小 private int maxPostSize = 100 * 1024 * 1024; public FileUploadServlet() { super(); } public void destroy() { super.destroy(); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到用户需要保存的服装的id //String dressId = request.getParameter("dressID"); //System.out.println(dressId); // 保存文件服务器中 response.setContentType("text/html; charset=UTF-8"); DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(4096); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax(maxPostSize); try { List fileItems = upload.parseRequest(request); Iterator iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { String name = item.getName(); System.out.println(name); try { item.write(new File(uploadPath + name)); } catch (Exception e) { e.printStackTrace(); } } } } catch (FileUploadException e) { e.printStackTrace(); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } public void init() throws ServletException { // Put your code here } }
您好!对于使用 Vert.x-MQTT 和 Protobuf 进行编解码,您可以按照以下步骤进行操作: 1. 首先,您需要确保已经在您的项目中添加了 Vert.x-MQTT 和 Protobuf 的相关依赖。 2. 创建一个 Protobuf 定义文件(.proto 文件),用于定义您的消息结构。例如,假设您的消息结构如下所示: ``` syntax = "proto3"; message MyMessage { string field1 = 1; int32 field2 = 2; } ``` 3. 使用 Protobuf 编译器将 .proto 文件编译为 Java 类。您可以使用以下命令行命令: ``` protoc --java_out=<output_directory> <your_proto_file.proto> ``` 此命令将生成相应的 Java文件,用于在代码中进行消息的编码和解码。 4. 在 Vert.x-MQTT 中使用编码器和解码器。您可以创建一个类来实现 Vert.x-MQTT 的 `MqttMessageCodec` 接口,并在其中实现编码和解码逻辑。在这个类中,您可以使用 Protobuf 生成的类来进行消息的序列化和反序列化。 以下是一个简单的示例: ```java import io.vertx.mqtt.MqttMessageCodec; import io.vertx.mqtt.messages.MqttPublishMessage; import com.example.protobuf.MyMessage; public class MyMessageCodec implements MqttMessageCodec<MyMessage> { @Override public void encodeToWire(Buffer buffer, MyMessage myMessage) { byte[] payload = myMessage.toByteArray(); // 在此处将 payload 写入到 buffer 中 } @Override public MyMessage decodeFromWire(int pos, Buffer buffer) { // 从 buffer 中读取 payload,并将其反序列化为 MyMessage 对象 byte[] payload = buffer.getBytes(pos, buffer.length()); return MyMessage.parseFrom(payload); } @Override public MyMessage transform(MqttPublishMessage mqttPublishMessage) { // 将 MqttPublishMessage 转换为 MyMessage 对象 byte[] payload = mqttPublishMessage.payload().getBytes(); return MyMessage.parseFrom(payload); } @Override public MqttPublishMessage transform(MyMessage myMessage) { // 将 MyMessage 对象转换为 MqttPublishMessage return MqttPublishMessage.create(myMessage.toByteArray(), false, QualityOfService.AT_MOST_ONCE, false); } } ``` 5. 最后,在您的 Vert.x-MQTT 代码中,使用您自定义的消息编解码器。示例如下: ```java MqttServerOptions options = new MqttServerOptions(); options.setCodecs(new MyMessageCodec()); MqttServer mqttServer = MqttServer.create(vertx, options); mqttServer.endpointHandler(endpoint -> { endpoint.publishHandler(message -> { // 处理收到的消息 MyMessage myMessage = message.payload(); // ... }); }).listen(); ``` 这样,您就可以使用 Vert.x-MQTT 和 Protobuf 进行消息的编码和解码了。 请注意,上述示例是一个简单示例,您可能需要根据您的实际需求进行适当的修改和调整。希望对您有所帮助!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值